Android11 分区目录适配指南

介绍

在 Android 11 中,Google 引入了一种新的文件存储模型,通过将存储空间分成不同的分区,以提供更好的隔离和安全性。这给开发者带来了一些挑战,特别是在访问外部存储上。本文将指导你如何适配 Android 11 的分区目录,以确保应用程序在新的存储模型下正常工作。

分区目录适配流程

下面是适配 Android 11 分区目录的基本步骤:

步骤 描述
1 确定你的应用程序需要访问的目录类型
2 更新 AndroidManifest.xml 文件
3 更新代码以适配分区目录
4 权限申请与运行时权限处理
5 测试与验证

接下来,我们将详细介绍每个步骤,并提供适配所需的代码示例。

1. 确定目录类型

首先,你需要确定你的应用程序需要访问的目录类型。在 Android 11 中,Google 引入了两种类型的目录:媒体目录和其他目录。

  • 媒体目录:用于存储媒体文件,如音频、视频和图片。
  • 其他目录:用于存储应用程序数据和其他非媒体文件。

根据你的应用程序需求,你可以选择适配一个或两个目录类型。

2. 更新 AndroidManifest.xml 文件

在适配分区目录之前,你需要更新你的 AndroidManifest.xml 文件以声明所需的权限和分区目录。以下是一个示例:

<manifest xmlns:android="
    package="com.example.app">

    <!-- 其他权限声明 -->
    
    <!-- 声明访问媒体目录的权限 -->
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

    <!-- 声明访问其他目录的权限 -->
    <uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />

    <application>
        <!-- 应用程序其他配置 -->
    </application>

</manifest>

请注意,访问媒体目录需要 READ_EXTERNAL_STORAGE 和 WRITE_EXTERNAL_STORAGE 权限,而访问其他目录需要 MANAGE_EXTERNAL_STORAGE 权限。

3. 更新代码以适配分区目录

接下来,你需要根据目录类型更新你的代码,以便在 Android 11 上正确访问分区目录。下面是一些示例代码:

访问媒体目录

File mediaDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES);

访问其他目录

File appDir = getExternalFilesDir(null);

上面的代码示例分别演示了如何访问媒体目录和其他目录。请根据你的实际需求使用适当的代码。

4. 权限申请与运行时权限处理

在 Android 11 中,访问分区目录的权限要求更加严格。为了确保你的应用程序在运行时具有所需的权限,你需要更新你的权限申请和运行时权限处理代码。以下是一个示例:

// 检查媒体目录的权限
if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE)
        != PackageManager.PERMISSION_GRANTED) {
    // 请求读取媒体目录的权限
    ActivityCompat.requestPermissions(this,
            new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},
            REQUEST_MEDIA_PERMISSION);
} else {
    // 已经拥有权限,执行相应操作
}

// 检查其他目录的权限
if (Environment.isExternalStorageManager()) {
    // 已经拥有权限,执行相应操作
} else {
    // 请求管理其他目录的权限
    Intent intent = new Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION);
    intent.setData(Uri.parse("package:" + getPackageName()));
    startActivityForResult(intent, REQUEST_OTHER_PERMISSION);
}

上面的代码示例演示了如何检查和请求访问分区目录的权限