Android 10 引入了对 内部存储权限的更改,旨在更好地爱护用户数据以及升高利用的存储空间。在 Android 11 开发者预览版 的时候也退出了很多改良,以帮忙开发者更好地适应这些权限批改。
在 Google Play 上公布的大部分利用都会 申请 (READ_EXTERNAL_STORAGE) 存储权限,来做一些诸如在 SD 卡中存储文件或者读取多媒体文件等惯例操作。这些利用可能会在磁盘中存储大量文件,即便利用被卸载了还会仍然存在。另外,这些利用还可能会读取其余利用的一些敏感文件数据。
在 Android 10 中,咱们调整了存储权限的工作形式,仅为利用提供其所需的拜访权限。这也是在激励利用在指定目录下进行文件存储以限度文件凌乱。当利用被卸载后,这些相干的目录也会被删除。
Android 10 所带来的对于存储上的变更遵循了以下三个根本准则
- 更好的从属性: 零碎晓得哪些文件属于哪些利用,这能够让用户更不便地治理他们的文件。当利用被卸载后,除非用户须要,否则利用之前所创立的文件也不应该保留在设施上;
- 爱护利用数据: 当一个利用将 它所属的文件 写入内部存储时,这些文件是不应该被其余利用所拜访的;
- 爱护用户数据: 当用户下载了一些文件,比方带有敏感信息的邮件附件,这些文件应该对其余利用不可见。
指标 API 级别 (Target SDK Level) 设定为 Android 10 的利用无需申请 Storage 权限,就能够应用本人的内部存储目录并治理媒体汇合 (音频、视频、图片和下载数据)。Storage 权限仅容许读取其余利用 共享 的音频、视频和图片汇合,但并不容许拜访非本利用创立的下载数据。在 Android 10 里惟一一种拜访其余利用创立的非媒体文件的路径是应用 存储拜访框架 (Storage Access Framework) 提供的文档选择器。
在 Android 11 中,通过下述的几点来持续优化分区存储 (Scoped Storage) 的开发者体验。
改良媒体存储
Android 10 中要求所有利用都应用 MediaStore API 来拜访照片、视频和音乐文件,咱们也将持续秉承这个准则。然而咱们也晓得,很多深度依赖基于原始文件门路 API 的利用和第三方库是很难切换到应用文件描述符 (File Descriptor) 的。因而在 Android 11 里,依赖原始文件门路的 API 和库 能够再次应用 了。您须要在利用的 Manifest 文件里增加 requestLegacyExternalStorage 属性,以保障 Android 10 的用户也能够应用该个性。
在理论的运行中,依赖原始文件门路的 I/O 申请会被重定向到应用 MediaStore API,当应用这种形式拜访本利用存储空间之外的文件时,这次重定向会造成性能影响。而且间接应用原始文件门路,并不会比应用 MediaStore API 有更多劣势,因而咱们强烈建议间接应用 MediaStore API。
在 Android 10 中,利用在对每一个文件申请编辑或删除时都必须失去用户的确认。而在 Android 11 中,利用能够一次申请 批改或者删除多个媒体文件。零碎的默认图库利用 (Gallery) 将不再展现这些对话框。咱们心愿这项改良可能使用户体验更加顺畅。
对 Storage Access Framework 的更新
当咱们对宽泛的存储拜访进行限度后,一些开发者试图应用 Storage Access Framework (SAF) 遍历整个文件系统。然而,SAF 并不适用于宽泛地访问共享存储内容。因而,咱们 对其进行了更新,限度了它对某些门路的可见性。
在 Android 11 中,将不再容许用户受权拜访 Downloads 的根目录、每个可用 SD 卡的根目录以及其它利用的目录。利用依然能够通过 Storage Access Framework API 或者文件选择器来帮忙用户从共享存储中选取个别文件。
针对文件治理利用的非凡权限
针对文件管理器以及一些备份类的利用,它们须要取得共享存储的更宽泛的拜访权限。Android 11 里引入了一个特地的权限叫做 **MANAGE
\_EXTERNAL\_STORAGE,该权限将受权读写所有共享存储内容,这也将同时蕴含非媒体类型的文件。然而取得这个权限的利用还是 无法访问 ** 其余利用的利用专属目录 (app-specific directory),无论是内部存储还是外部存储。
咱们心愿持续容许一些的确有宽泛拜访内部存储文件需要的利用。在 Android 11 中,已取得 MANAGE\_EXTERNAL\_STORAGE 权限的利用,能够将用户疏导至零碎设置页面,让用户抉择是否容许该利用 “ 拜访所有文件 ” (All Files Access)。上面的两种利用示例是能够应用该权限的:
- 文件管理器 —— 该类利用的次要性能是管理文件;
- 备份和复原 —— 该类利用须要拜访大批量的文件 (比方切换设施的时候进行数据迁徙,或者将数据备份到云端)。
如果您的利用须要拜访单个文件,比方文字处理利用,则应该应用 Storage Access Framework (SAF)。
如果您的利用须要 MANAGE\_EXTERNAL\_STORAGE 权限或者调用了依赖原始文件门路的 API,那么您必须在 AndroidManifest 文件中增加 requestLegacyExternalStorage=true
,这样您的利用才可能在搭载 Android 10 的设施上失常运行。
更多相干信息请查看上面,咱们在去年 Android 开发者峰会的分享视频《筹备好应用分区存储》:
https://www.bilibili.com/vide…
或查看 Android 开发者文档:《Android 11 中的存储更新》
咱们非常重视您的反馈,您能够通过 issues tracker 向咱们反馈 issue 或新个性需要。