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);
}
上面的代码示例演示了如何检查和请求访问分区目录的权限