Android(API 29)10 發布至今已經有不少設備完成升級,如:***小米9、Redmi K20pro、華為 P30pro/Mate30pro 、榮耀 v30/v20、Oppo Reno、ONnePlus 7T、谷歌 Pixel ***等都已經升級到 Android 10 的支持,不少應用市場也要求應用需要針對 Android 10 進行適配,其中最大的變更之一就是 scoped storage。
在針對目前 小米、華為、Pixel 的幾臺 Android 10 手機做了測試,在不設置 requestLegacyExternalStorage
的前提下得到結論(官方還沒完全開啟限制的前提):
- 1、targetSDK 用 28 編譯的在 Android 10 上還是可以讀取到全部文件, 之后覆蓋安裝一個使用 targetSDK 29 的,還能繼續可以訪問全路徑。
- 2、卸載后直接用 targetSDK 29 編譯的會讀取不到。
而官方明確表示:
明年(2020),主要平臺版本將要求所有應用都使用分區存儲,無論應用的目標 SDK 級別是多少。因此,您應該提前確保您的應用能夠使用分區存儲。為此,請確保針對搭載 Android 10(API 級別 29)及更高版本的設備啟用了該行為。
所以不管是使用 requestLegacyExternalStorage
還是降低 targetSDK
都無法在接下來2020 年的 Android(API 29)10 新版更新中被豁免。
雖然作為 Android 開發會因為無法對用戶存儲目錄“為所欲為”而頭痛,但是作為用戶卻是感覺欣喜的。
因為長期以來 Android 用戶的本地存儲目錄都十分雜亂,開發者只要申請一次權限就可以“為所欲為”地創建和讀取本地存儲,雖然谷歌在 Android 4.4(API 19))引入了存 SAF(Storage Access Framework) , 但是開發者大部分時候都選擇無視。
我甚至想要一個系統標志出這個文件是誰創建的 API ,因為最近遇到這個問題卻沒有頭緒: 為什么相冊里總是多出一張空白圖片,刪了后不久又重現?
官方解讀
為了讓用戶更好地管理自己的文件并減少混亂,Android 10(API 29)開始應用在默認情況下會被要求使用 scoped storage(即分區存儲),也就是說應用只能看到自己專有的目錄(Context.getExternalFilesDir()
)以及特定類型的媒體文件。
注意這個是強制性的,但是會有緩沖期,官方明確額表示,除非你的應用真的有強烈需要訪問專有目錄以及
MediaStore
之外的文件,否則最好使用分區存儲。
使用分區存儲的應用對自己創建的文件始終擁有讀/寫權限,無論文件是否位于應用的專有目錄內 。這說明了默認分區存儲內的文件也只有應用自己能看到,就像是沙盒內,同時 getExternalFilesDir()
下的文件會隨著應用卸載而清除。
也就是說應用可以無需申請任何權限使用 getExternalFilesDir()
、 MediaStore
和 SAF
讀寫文件, 當然如果使用 MediaStore
讀取其他應用的媒體集合時,是需要 READ_EXTERNAL_STORAGE
。
而 MediaStore
中支持的類型有:
另外還有其他的限制,比如:
- 應用沒有
ACCESS_MEDIA_LOCATION
權限,那么訪問到的媒體資源中的Exif
元數據會被修改. - 使用
MediaStore.Files
也僅顯示照片、視頻和音頻文件,例如不會顯示表中的 PDF 文件。
總結起來結論就是:
- 1、獲取系統相冊、視頻,圖片等需要通過
SAF
,利用ContentResolver
的Cursor
來提供。 - 2、訪問公有目錄也需要通過
MediaStore
和ContentResolver
,比如保存圖片到外部公共存儲,拷貝文件到 Download 目錄等等。 - 3、比如
new File(path).createNewFile();
等的判斷在公共目錄下不能再用了。
簡單來說就是:應用在自己的沙盒內可以“為所欲為”,通過 MediaStore
可以分類整理文件,通過 SAF
可以訪問其他應用的公共媒體文件。
-
Android
+關注
關注
12文章
3946瀏覽量
128010 -
華為
+關注
關注
216文章
34547瀏覽量
253149 -
API
+關注
關注
2文章
1518瀏覽量
62452
發布評論請先 登錄
相關推薦
如何在Ubuntu Linux上釋放/boot分區中的空間
如何選擇DSP芯片的外部存儲器?
Android手機的輕量級訪問控制
![<b class='flag-5'>Android</b>手機的輕量級<b class='flag-5'>訪問</b>控制](https://file.elecfans.com/web2/M00/49/57/pYYBAGKhtEeAO-J2AAATLk_dC8g857.jpg)
解讀片上RAM和外部RAM訪問速度的差異問題
什么是Swap分區 NVMe上如何使用Swap分區
Google官方宣布:將推出的Android Q 將被命名為 Android 10
以訪問外部SDRAM為例來說明降低外部存儲系統功耗的方法
![以<b class='flag-5'>訪問</b><b class='flag-5'>外部</b>SDRAM為例來說明降低<b class='flag-5'>外部</b><b class='flag-5'>存儲</b>系統功耗的方法](https://file.elecfans.com//web1/M00/D2/13/pIYBAF_HR12AcmV_AAAuy-sCBkU034.jpg)
MySQL分區表的類型及原理
![MySQL<b class='flag-5'>分區</b>表的類型及原理](https://file1.elecfans.com/web2/M00/81/EF/wKgaomQj0t6AH-aYAAEWTgP_Z2c832.jpg)
Android 11的外部存儲權限申請流程分享
![<b class='flag-5'>Android</b> 11的<b class='flag-5'>外部</b><b class='flag-5'>存儲</b>權限申請流程分享](https://file1.elecfans.com/web2/M00/88/B8/wKgaomRwJ1aARhI1AALgYQbwIYI799.jpg)
評論