Android(API 29)10 發(fā)布至今已經(jīng)有不少設(shè)備完成升級(jí),如:***小米9、Redmi K20pro、華為 P30pro/Mate30pro 、榮耀 v30/v20、Oppo Reno、ONnePlus 7T、谷歌 Pixel ***等都已經(jīng)升級(jí)到 Android 10 的支持,不少應(yīng)用市場(chǎng)也要求應(yīng)用需要針對(duì) Android 10 進(jìn)行適配,其中最大的變更之一就是 scoped storage。
在針對(duì)目前 小米、華為、Pixel 的幾臺(tái) Android 10 手機(jī)做了測(cè)試,在不設(shè)置 requestLegacyExternalStorage 的前提下得到結(jié)論(官方還沒(méi)完全開(kāi)啟限制的前提):
- 1、targetSDK 用 28 編譯的在 Android 10 上還是可以讀取到全部文件, 之后覆蓋安裝一個(gè)使用 targetSDK 29 的,還能繼續(xù)可以訪問(wèn)全路徑。
- 2、卸載后直接用 targetSDK 29 編譯的會(huì)讀取不到。

而官方明確表示:
明年(2020),主要平臺(tái)版本將要求所有應(yīng)用都使用分區(qū)存儲(chǔ),無(wú)論應(yīng)用的目標(biāo) SDK 級(jí)別是多少。因此,您應(yīng)該提前確保您的應(yīng)用能夠使用分區(qū)存儲(chǔ)。為此,請(qǐng)確保針對(duì)搭載 Android 10(API 級(jí)別 29)及更高版本的設(shè)備啟用了該行為。
所以不管是使用 requestLegacyExternalStorage 還是降低 targetSDK 都無(wú)法在接下來(lái)2020 年的 Android(API 29)10 新版更新中被豁免。
雖然作為 Android 開(kāi)發(fā)會(huì)因?yàn)闊o(wú)法對(duì)用戶(hù)存儲(chǔ)目錄“為所欲為”而頭痛,但是作為用戶(hù)卻是感覺(jué)欣喜的。
因?yàn)殚L(zhǎng)期以來(lái) Android 用戶(hù)的本地存儲(chǔ)目錄都十分雜亂,開(kāi)發(fā)者只要申請(qǐng)一次權(quán)限就可以“為所欲為”地創(chuàng)建和讀取本地存儲(chǔ),雖然谷歌在 Android 4.4(API 19))引入了存 SAF(Storage Access Framework) , 但是開(kāi)發(fā)者大部分時(shí)候都選擇無(wú)視。
我甚至想要一個(gè)系統(tǒng)標(biāo)志出這個(gè)文件是誰(shuí)創(chuàng)建的 API ,因?yàn)樽罱龅竭@個(gè)問(wèn)題卻沒(méi)有頭緒: 為什么相冊(cè)里總是多出一張空白圖片,刪了后不久又重現(xiàn)?
官方解讀
為了讓用戶(hù)更好地管理自己的文件并減少混亂,Android 10(API 29)開(kāi)始應(yīng)用在默認(rèn)情況下會(huì)被要求使用 scoped storage(即分區(qū)存儲(chǔ)),也就是說(shuō)應(yīng)用只能看到自己專(zhuān)有的目錄(Context.getExternalFilesDir())以及特定類(lèi)型的媒體文件。
注意這個(gè)是強(qiáng)制性的,但是會(huì)有緩沖期,官方明確額表示,除非你的應(yīng)用真的有強(qiáng)烈需要訪問(wèn)專(zhuān)有目錄以及
MediaStore之外的文件,否則最好使用分區(qū)存儲(chǔ)。
使用分區(qū)存儲(chǔ)的應(yīng)用對(duì)自己創(chuàng)建的文件始終擁有讀/寫(xiě)權(quán)限,無(wú)論文件是否位于應(yīng)用的專(zhuān)有目錄內(nèi) 。這說(shuō)明了默認(rèn)分區(qū)存儲(chǔ)內(nèi)的文件也只有應(yīng)用自己能看到,就像是沙盒內(nèi),同時(shí) getExternalFilesDir()下的文件會(huì)隨著應(yīng)用卸載而清除。
也就是說(shuō)應(yīng)用可以無(wú)需申請(qǐng)任何權(quán)限使用 getExternalFilesDir() 、 MediaStore 和 SAF 讀寫(xiě)文件, 當(dāng)然如果使用 MediaStore 讀取其他應(yīng)用的媒體集合時(shí),是需要 READ_EXTERNAL_STORAGE 。
而 MediaStore 中支持的類(lèi)型有:
- 照片:存儲(chǔ)在
MediaStore.Images中。 - 視頻:存儲(chǔ)在
MediaStore.Video中。 - 音頻文件:存儲(chǔ)在
MediaStore.Audio中。
另外還有其他的限制,比如:
- 應(yīng)用沒(méi)有
ACCESS_MEDIA_LOCATION權(quán)限,那么訪問(wèn)到的媒體資源中的Exif元數(shù)據(jù)會(huì)被修改. - 使用
MediaStore.Files也僅顯示照片、視頻和音頻文件,例如不會(huì)顯示表中的 PDF 文件。
總結(jié)起來(lái)結(jié)論就是:
- 1、獲取系統(tǒng)相冊(cè)、視頻,圖片等需要通過(guò)
SAF,利用ContentResolver的Cursor來(lái)提供。 - 2、訪問(wèn)公有目錄也需要通過(guò)
MediaStore和ContentResolver,比如保存圖片到外部公共存儲(chǔ),拷貝文件到 Download 目錄等等。 - 3、比如
new File(path).createNewFile();等的判斷在公共目錄下不能再用了。
簡(jiǎn)單來(lái)說(shuō)就是:應(yīng)用在自己的沙盒內(nèi)可以“為所欲為”,通過(guò) MediaStore 可以分類(lèi)整理文件,通過(guò) SAF 可以訪問(wèn)其他應(yīng)用的公共媒體文件。
-
Android
+關(guān)注
關(guān)注
12文章
3980瀏覽量
132668 -
華為
+關(guān)注
關(guān)注
217文章
35618瀏覽量
259691 -
API
+關(guān)注
關(guān)注
2文章
1969瀏覽量
65767
發(fā)布評(píng)論請(qǐng)先 登錄
如何在Ubuntu Linux上釋放/boot分區(qū)中的空間
Android中數(shù)據(jù)存儲(chǔ)的介紹和使用
如何選擇DSP芯片的外部存儲(chǔ)器?
解讀片上RAM和外部RAM訪問(wèn)速度的差異問(wèn)題
什么是Swap分區(qū) NVMe上如何使用Swap分區(qū)
Google官方宣布:將推出的Android Q 將被命名為 Android 10
以訪問(wèn)外部SDRAM為例來(lái)說(shuō)明降低外部存儲(chǔ)系統(tǒng)功耗的方法
MySQL分區(qū)表的類(lèi)型及原理
Android 11的外部存儲(chǔ)權(quán)限申請(qǐng)流程分享
外部存儲(chǔ)和內(nèi)部存儲(chǔ)的區(qū)別
SD卡外部存儲(chǔ)使用方法
8位PIC單片機(jī)上的存儲(chǔ)器訪問(wèn)分區(qū)
外部存儲(chǔ)器有哪些
服務(wù)器數(shù)據(jù)恢復(fù)—重裝系統(tǒng)后OceanStor存儲(chǔ)上的分區(qū)數(shù)據(jù)丟失這樣恢復(fù)

Android(Q)10 上的分區(qū)外部存儲(chǔ)訪問(wèn)
評(píng)論