回顾 Android 11 中的存储机制更新

会议终结者
• 阅读 4002

回顾 Android 11 中的存储机制更新

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) 将不再展示这些对话框。我们希望这项改进能够使用户体验更加顺畅。

回顾 Android 11 中的存储机制更新

对 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 或新特性需求。

点赞
收藏
评论区
推荐文章
美凌格栋栋酱 美凌格栋栋酱
7个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
全靠这份Android知识点PDF大全,月薪30K
第一阶段:Android基础知识回顾:回顾Android开发编程,深入理解Android系统原理和层次结构,深入分析Handler源码和原理;回顾Java,C/C,Kotlin、dart在Android开发中必用的语言,熟悉一下几种语言混淆后的特性;回顾AndroidIPC和JNI的底层原理和热更新技术回顾Native开发要点,使用C结
梦
4年前
微信小程序new Date()转换时间异常问题
微信小程序苹果手机页面上显示时间异常,安卓机正常问题image(https://imghelloworld.osscnbeijing.aliyuncs.com/imgs/b691e1230e2f15efbd81fe11ef734d4f.png)错误代码vardate'2021030617:00:00'vardateT
似梦清欢 似梦清欢
2年前
链表
线性表的链式存储实现称为链表。!image(https://imghelloworld.osscnbeijing.aliyuncs.com/imgs/eb5f24c795ece73a1f77156aa7131869.png)
java一生之敌 java一生之敌
2年前
JVM的内存模型和优化方式
一、JVM的内存模型1.!图片(https://imghelloworld.osscnbeijing.aliyuncs.com/imgs/52b2220f04010eb329efbef966f9fa40.png)其中s0,s1为幸
似梦清欢 似梦清欢
2年前
数据结构概述
1.有序列表逻辑结构和存储结构!image(https://imghelloworld.osscnbeijing.aliyuncs.com/imgs/f08fe88e8457bac682c1ae8f33817873.png)四种逻辑结构
Stella981 Stella981
3年前
Android之外部存储设备监听
区分外置U盘及TF卡最近有个项目有内置SD卡同时又保留了USB及sd卡口,由于要计算外置存储设备的空间,尝试了几个方法均不理想最终使用如下方法可以成功的区分外置设备是U盘还是SD卡。主要通过如下方法区分U盘及TF卡@SuppressLint("PrivateApi")privateStringget
Stella981 Stella981
3年前
Android 设置系统闹铃和日历
一、创建定时器 设置权限<usespermissionandroid:name"com.android.alarm.permission.SET_ALARM"/案例https://developer.android.com/reference/android/provider/Alar
Stella981 Stella981
3年前
Android 数据存储(笔记)
Android数据存储Android中数据存储的方式有一下几种:一.SharedPreferences:            是一种轻量级的数据存储方式,主要用于保存应用的一些常用配置,以xml文件的方式存储数据,            以键值对的方式存取数据。            SharedPrefer
Stella981 Stella981
3年前
Hacker News 简讯 2020
!(https://oscimg.oschina.net/oscnet/up3b137e2e6620f7a63f11a96485b1fb3b.png)最后更新时间:2020082623:00