Android Q适配(存储空间)
介绍
https://developer.android.google.cn/preview/privacy/scoped-storage
存储访问框架:https://developer.android.google.cn/guide/topics/providers/document-provider
FileProvider:https://developer.android.google.cn/training/secure-file-sharing/setup-sharing
测试方案
测试行为变更
要在 Android Q 测试版 1 中启用此行为变更,请在终端窗口中执行以下命令:
adb shell sm set-isolated-storage on
查看是否已生效
adb shell getprop sys.isolated_storage_snapshot
测试兼容性模式行为
测试您的应用时,您可以通过在终端窗口中运行以下命令来为外部文件存储访问权限启用兼容性模式:
adb shell cmd appops set your-package-name android:legacy_storage allow
停用兼容性模式,请在 Android Q 上卸载然后重新安装您的应用,或在终端窗口中运行以下命令
adb shell cmd appops set your-package-name android:legacy_storage default
影响
变更如下
https://developer.android.google.cn/preview/privacy/scoped-storage
-
私有文件沙盒
- 沙箱目录: /sdcard/Android/sandbox/packagename/
- 任何其他应用都无法直接访问您应用的沙盒文件。由于文件是您应用的私有文件,因此您不再需要任何权限即可在外部存储设备中访问和保存自己的文件
- 当app卸载后,沙箱中的文件删除
-
媒体文件共享集合
- 访问权限
- 共享方案
-
照片访问
- 位置信息
- 图库显示
-
跨应用文件
读取和存储跨应用文件
影响范围
Google 把 Android Q 上会被沙箱化条件设为 Target SDK 至少为 Q (29) 的应用或者运行 Android Q 时全新安装的应用。不符合这个条件的应用将会运行在兼容模式下,在兼容模式中应用行为大致和过去相同,以保证不会出现严重的数据丢失问题。兼容模式在应用重新安装后会被关闭。
注意:即使应用Target SDK < 29也会被沙箱化
影响点
-
沙箱化后,沙箱目录:/sdcard/Android/sandbox/packagename/,应用不能再通过 Java File API 来互相访问内部存储文件数据,应用访问 “/sdcard” 实质上访问的是你的应用的沙箱目录,可以理解为“存储重定向”; getExternalStoragePublicDirectory(),getExternalStorageDirectory(),/storage/emulated/0 都会直接映射到沙箱目录;访问这些文件路径存在自动映射,因此正常直接使用理论上都是没问题的。
-
可能存储数据丢失:当用户手机从Android Q以下版本升级到Android Q版本的时候,应用访问不了之前保存在/sdcard下面的内容
-
沙箱空间跟过去的内部存储空间内 “Android/data/packagename” 的文件夹一样,会在应用卸载时被永久清除无法恢复,因此比如一些用户主动下载保存的文件固然不能存在沙箱空间,需要存到沙箱外面
检查及适配
checke点
sdcard
getExternalStorageDirectory
getExternalStoragePublicDirectory
/emulated/0