Android 10文件适配

Posted by OOFTF Blog on May 24, 2021

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的应用,其访问权限范围限定为分区存储。此应用无需请求与存储相关的用户权限,即可以查看外部存储中以下类型的文件:

  1. 应用外部特定目录中的文件(使用 getExternalFilesDir() 访问)。
  2. 应用自己创建的照片、视频和音频(通过MediaStore访问)。

以下两种情况比较特殊,不会受到沙盒机制的影响:

  1. 如果应用已经安装在Android 10 以下的系统,然后系统通过Fota升级到Android 10
  2. 如果已经安装 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卸载不影响