作者:fishforest
鏈接:http://www.itdecent.cn/p/d5573e312bb8
先來看看存儲(chǔ)區(qū)域劃分

1、分區(qū)存儲(chǔ)原理
1、App訪問自身內(nèi)部存儲(chǔ)空間、訪問外部存儲(chǔ)空間-App私有目錄不需要任何權(quán)限(這個(gè)與Android 10.0之前一致)
2、外部存儲(chǔ)空間-共享存儲(chǔ)空間、外部存儲(chǔ)空間-其它目錄 App無法通過路徑直接訪問,不能新建、刪除、修改目錄/文件等
3、外部存儲(chǔ)空間-共享存儲(chǔ)空間、外部存儲(chǔ)空間-其它目錄 需要通過Uri訪問
分區(qū)存儲(chǔ)的變更在于第二點(diǎn)、第三點(diǎn)。
2、Android 10.0 存儲(chǔ)訪問方式變更地方在于
自帶外部存儲(chǔ)-共享存儲(chǔ)空間和自帶外部存儲(chǔ)-其它目錄
以上兩個(gè)地方不能通過路徑直接訪問文件,而是需要通過Uri訪問。
3、Android 10/11 存儲(chǔ)適配建議
通過分析Android 10/11存儲(chǔ)適配方式,了解到了不同的系統(tǒng)需要如何進(jìn)行適配,此時(shí)就需要一個(gè)統(tǒng)一的適配方案了。
適配核心
分區(qū)存儲(chǔ)是核心,App自身產(chǎn)生的文件應(yīng)該存放在自己的目錄下:
/sdcard/Android/data/packagename/ 和/data/data/packagename/
這兩個(gè)目錄本App無需申請?jiān)L問權(quán)限即可申請,其它App無法訪問本App的目錄。
適配共享存儲(chǔ)
共享存儲(chǔ)空間里的文件需要通過Uri構(gòu)造輸入輸出流訪問,Uri獲取方式有兩種:MediaStore和SAF。
適配其它目錄
在Android 11上需要申請?jiān)L問所有文件的權(quán)限。
具體做法
第一步
在AndroidManifest.xml里添加如下字段:
權(quán)限聲明:
<uses-permissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGE"/><uses-permissionandroid:name="android.permission.READ_EXTERNAL_STORAGE"/><uses-permissionandroid:name="android.permission.MANAGE_EXTERNAL_STORAGE"/>
在<application/>標(biāo)簽下添加如下字段:
android:requestLegacyExternalStorage="true"
第二步
如果需要訪問共享存儲(chǔ)空間,則判斷運(yùn)行設(shè)備版本是否大于等于Android6.0,若是則需要申請WRITE_EXTERNAL_STORAGE 權(quán)限。拿到權(quán)限后,通過Uri訪問共享存儲(chǔ)空間里的文件。
如果需要訪問其它目錄,則通過SAF訪問
第三步
如果想要做文件管理器、病毒掃描管理器等功能。則判斷運(yùn)行設(shè)備版本是否大于等于Android 6.0,若是先需要申請普通的存儲(chǔ)權(quán)。若運(yùn)行設(shè)備版本為Android 10.0,則可以直接通過路徑訪問/sdcard/目錄下文件(因?yàn)榻昧朔謪^(qū)存儲(chǔ));若運(yùn)行設(shè)備版本為Android 11.0,則需要申請MANAGE_EXTERNAL_STORAGE 權(quán)限。