Android10 (API 29) 文件储存适配
- 当 targetSdkVersion>=29 的时候需要适配 Android10 的文件沙盒机制
- Environment下的文件不再具有读写权限,Context.getXXXDir()可以正常使用
- targetSdkVersion < 29,不受影响
- targetSdkVersion >= 29 受影响
targetSdkVersion=29 的兼容方案
当targetSdkVersion=29 或者 手机版本为 29 时可以使用以下代码暂时不使用文件沙盒机制,但是当 targetSdkVersion=30 并且手机Android版本为30 时这种方式就没有作用了,只能适配沙盒机制
1
2
3
<application
android:requestLegacyExternalStorage="true">
</application>
分区存储定义
变更:默认情况下,对于targetSdkVersion大于等于29的应用,其访问权限范围限定为分区存储。此应用无需请求与存储相关的用户权限,即可以查看外部存储中以下类型的文件:
- 应用外部特定目录中的文件(使用 getExternalFilesDir() 访问)。
- 应用自己创建的照片、视频和音频(通过MediaStore访问)。
以下两种情况比较特殊,不会受到沙盒机制的影响:
- 如果应用已经安装在Android 10 以下的系统,然后系统通过Fota升级到Android 10
- 如果已经安装 targetSdkVersion<29 的版本,应用通过更新升级到 targetSdkVersion >= 29
Android 文件系统
方法 | 路径 | 描述 |
---|---|---|
context.getFilesDir() | /data/user/0/${ApplicationId}/files | 对应应用详情里面的”清除数据”;App卸载后清除 |
context.getCacheDir() | /data/user/0/${ApplicationId}/cache | 对应应用详情里面的”清除缓存”;App卸载后清除 |
context.getExternalFilesDir(String type) | /storage/emulated/0/Android/data/${ApplicationId}/files | 一般放一些长时间保存的数据;对应应用详情里面的”清除数据”;App卸载后清除 |
context.getExternalCacheDir() | /storage/emulated/0/Android/data/${ApplicationId}/cache | 一般存放临时缓存数据;对应应用详情里面的”清除缓存”;App卸载后清除 |
context.getCrateDir(“2”) | /data/user/0/${ApplicationId}/crates/2 | 箱 |
Environment.getExternalStorageDirectory() | /storage/emulated/0 | 与APP无关的共用区域,Android10引入沙盒机制后不能再使用;没有对应的清除选项;App卸载不影响 |
Environment.getDataDirectory() | /data | 与APP无关的共用区域;没有对应的清除选项;App卸载不影响 |