Android 11 的 Scoped Storage(存储沙盒)改动大致如下:
- 目标 SDK 到 R 的应用不能再通过 requestLegacyExternalStorage 属性来使用原来的 Java File API 访问存储,而旧版本应用仍然可以继续访问完整存储。
- 对 MediaStore 的写入、收藏、封存、删除操作提供了批量接口
- 拥有读取权限的应用在使用 Native 库也可以通过原始路径读取媒体文件(早在 Q 的时候 MediaStore 就对媒体文件路径返回 /mnt/content/media/external/images/xxx 这样的结果,但一些库会无法利用这个路径,例如 Nio Files API,过去我在博客也留下了
备注)
- 即便通过 Storage Access Framework 也不能请求 Download 和存储根的目录权限了,避免某些应用欺骗用户获取了整个存储的读写权限(请求单个文件依旧可以在这些目录)。同时不能请求 /Android/[data, obb] 的所有文件夹。
- 响应文件管理器、备份还原应用开发者的请求,新增了 MANAGE_EXTERNAL_STORAGE 权限(Google 官方称为 All Files Access)允许应用读写共享存储和媒体库的内容。结合测试过程和文档解释,似乎与原被废弃的 Java File API 无关(依旧无法直接用 File 访问根目录),暂未详细分析。
官方文档:https://developer.android.com/preview/privacy/storage#scoped-storage