返回

]> Android Q & Android 11存储适配(一) 基础知识点梳理

Android

技术的前沿:Android Q & Android 11 存储适配解析(一)

<[#title]>
Android Q & Android 11存储适配(一) 基础知识点梳理
</#title]>

Android 存储适配梳理

Android 存储适配是什么?

Android 存储适配是指 Android Q 及以后版本中,对文件访问进行的权限管理机制,旨在进一步加强对用户隐私数据的保护。

存储适配为什么要调整?

用户体验差

应用可以任意访问用户所有照片、音乐、视频文件,会导致一些应用可能访问到用户不想被访问的数据。

存在安全风险

存在安全风险,应用可以窃取用户敏感信息,使用户隐私泄露。

侵占用户存储空间

应用可以随意下载文件保存到用户手机上,侵占用户存储空间。

Android 11 的存储适配机制是什么?

存储分组

基于 Android Q 构建了分级的存储模型。将文件大致分为三大类:照片、视频、音频。

权限管理

对三大类文件,赋予了不同的访问权限。想要访问这些文件,需要分别获取访问权限。

访问回调

如果应用需要访问文件,首先需要判断自己是否拥有访问权限,如果拥有,则可以直接访问;否则需要向用户申请权限。如果用户同意,则授予应用权限;如果用户拒绝,则应用无法访问该文件。

存储变更内容及适配重点

系统存储变更

取消访问 ALL_FILES 权限

原有针对所有类型文件的访问权限 ALL_FILES 权限已被取消。

新增 MediaStore.Images、MediaStore.Audio 和 MediaStore.Video 三个表

增加了三个只读表,应用可以通过它们读取特定的媒体文件(分别对应照片、音频和视频文件)。

文件访问权限控制

Android Q 引入的 scoped storage 将应用对文件存储的访问权限划分为三大类,分别是图片、音频和视频。

应用存储适配指南

申请读取权限

  1. 申请读取权限:应用需要在清单文件中申请读取文件权限,如访问照片,需要申请 READ_EXTERNAL_STORAGE 权限。
  2. 检查权限:应用在访问文件前需要检查是否已经拥有读取权限。
  3. 显示读取权限申请对话框:如果应用没有读取权限,需要向用户显示读取权限申请对话框,用户同意后才能读取文件。

存储操作适配

  1. 使用 MediaStore API:应用需要使用 MediaStore API 来读取文件,不能直接使用文件路径。
  2. 使用 URI 访问文件:应用需要使用 URI 来访问文件,而不是直接使用文件路径。
  3. 使用 FileProvider 共享文件:如果应用需要共享文件,需要使用 FileProvider 来共享,不能直接使用文件路径。

存储适配示例

// 判断应用是否有读取外部存储权限
if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) {
    // 如果有,直接读取文件
    try {
        // 读取文件
        ...
    } catch (Exception e) {
        e.printStackTrace();
    }
} else {
    // 如果没有,向用户申请读取权限
    ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, REQUEST_CODE_READ_EXTERNAL_STORAGE);
}