作者:fishforest
链接:https://www.jianshu.com/p/d5573e312bb8
先来看看存储区域划分
1、分区存储原理
1、App访问自身内部存储空间、访问外部存储空间-App私有目录不需要任何权限(这个与Android 10.0之前一致)
2、外部存储空间-共享存储空间、外部存储空间-其它目录 App无法通过路径直接访问,不能新建、删除、修改目录/文件等
3、外部存储空间-共享存储空间、外部存储空间-其它目录 需要通过Uri访问
分区存储的变更在于第二点、第三点。
2、Android 10.0 存储访问方式变更地方在于
自带外部存储-共享存储空间和自带外部存储-其它目录
以上两个地方不能通过路径直接访问文件,而是需要通过Uri访问。
3、Android 10/11 存储适配建议
通过分析Android 10/11存储适配方式,了解到了不同的系统需要如何进行适配,此时就需要一个统一的适配方案了。
适配核心
分区存储是核心,App自身产生的文件应该存放在自己的目录下:
/sdcard/Android/data/packagename/ 和/data/data/packagename/
这两个目录本App无需申请访问权限即可申请,其它App无法访问本App的目录。
适配共享存储
共享存储空间里的文件需要通过Uri构造输入输出流访问,Uri获取方式有两种:MediaStore和SAF。
适配其它目录
在Android 11上需要申请访问所有文件的权限。
具体做法
第一步
在AndroidManifest.xml里添加如下字段:
权限声明:
<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/>标签下添加如下字段:
android:requestLegacyExternalStorage="true"
第二步
如果需要访问共享存储空间,则判断运行设备版本是否大于等于Android6.0,若是则需要申请WRITE_EXTERNAL_STORAGE 权限。拿到权限后,通过Uri访问共享存储空间里的文件。
如果需要访问其它目录,则通过SAF访问
第三步
如果想要做文件管理器、病毒扫描管理器等功能。则判断运行设备版本是否大于等于Android 6.0,若是先需要申请普通的存储权。若运行设备版本为Android 10.0,则可以直接通过路径访问/sdcard/目录下文件(因为禁用了分区存储);若运行设备版本为Android 11.0,则需要申请MANAGE_EXTERNAL_STORAGE 权限。