实现 Android 11 文件存储权限
概述
在 Android 11 及更高版本中,对于外部存储的访问权限有了一些改变。为了保护用户的隐私和数据安全,应用程序需要适配新的文件存储权限机制。本文将介绍如何实现 Android 11 文件存储权限的步骤和相应的代码示例。
流程
以下是实现 Android 11 文件存储权限的主要步骤:
步骤 | 操作 |
---|---|
1 | 检查应用程序是否已请求 MANAGE_EXTERNAL_STORAGE 权限 |
2 | 请求 MANAGE_EXTERNAL_STORAGE 权限 |
3 | 检查应用程序是否具有 READ_EXTERNAL_STORAGE 和 WRITE_EXTERNAL_STORAGE 权限 |
4 | 请求 READ_EXTERNAL_STORAGE 和 WRITE_EXTERNAL_STORAGE 权限 |
5 | 适配 Scoped Storage |
6 | 迁移应用程序的文件访问逻辑 |
操作步骤及代码示例
步骤 1:检查应用程序是否已请求 MANAGE_EXTERNAL_STORAGE 权限
通过检查应用程序是否已经请求了 MANAGE_EXTERNAL_STORAGE 权限,可以确定是否需要请求该权限。
// 检查应用程序是否已请求 MANAGE_EXTERNAL_STORAGE 权限
if (ContextCompat.checkSelfPermission(this, Manifest.permission.MANAGE_EXTERNAL_STORAGE)
!= PackageManager.PERMISSION_GRANTED) {
// 请求 MANAGE_EXTERNAL_STORAGE 权限
ActivityCompat.requestPermissions(this,
new String[]{Manifest.permission.MANAGE_EXTERNAL_STORAGE}, REQUEST_MANAGE_STORAGE_PERMISSION);
}
步骤 2:请求 MANAGE_EXTERNAL_STORAGE 权限
在步骤 1 中,如果应用程序未请求 MANAGE_EXTERNAL_STORAGE 权限,则需要请求该权限。
// 请求 MANAGE_EXTERNAL_STORAGE 权限
ActivityCompat.requestPermissions(this,
new String[]{Manifest.permission.MANAGE_EXTERNAL_STORAGE}, REQUEST_MANAGE_STORAGE_PERMISSION);
步骤 3:检查应用程序是否具有 READ_EXTERNAL_STORAGE 和 WRITE_EXTERNAL_STORAGE 权限
在进行 Scoped Storage 适配之前,需要检查应用程序是否已具有 READ_EXTERNAL_STORAGE 和 WRITE_EXTERNAL_STORAGE 权限。
// 检查应用程序是否具有 READ_EXTERNAL_STORAGE 和 WRITE_EXTERNAL_STORAGE 权限
if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE)
!= PackageManager.PERMISSION_GRANTED ||
ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)
!= PackageManager.PERMISSION_GRANTED) {
// 请求 READ_EXTERNAL_STORAGE 和 WRITE_EXTERNAL_STORAGE 权限
ActivityCompat.requestPermissions(this,
new String[]{Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQUEST_STORAGE_PERMISSIONS);
}
步骤 4:请求 READ_EXTERNAL_STORAGE 和 WRITE_EXTERNAL_STORAGE 权限
在步骤 3 中,如果应用程序未请求 READ_EXTERNAL_STORAGE 和 WRITE_EXTERNAL_STORAGE 权限,则需要请求这两个权限。
// 请求 READ_EXTERNAL_STORAGE 和 WRITE_EXTERNAL_STORAGE 权限
ActivityCompat.requestPermissions(this,
new String[]{Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQUEST_STORAGE_PERMISSIONS);
步骤 5:适配 Scoped Storage
在 Android 11 中,Scoped Storage 是默认的文件访问模型。为了适应这个变化,需要对应用程序的文件访问逻辑进行调整。具体的适配方法请参考 Android 官方文档。
步骤 6:迁移应用程序的文件访问逻辑
根据应用程序的具体需求,需要修改文件访问逻辑。以下是一个示例,演示如何使用新的文件访问 API 进行文件读写操作。
// 使用新的文件访问 API 进行文件读写操作
try {
Uri uri = contentResolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
if (uri != null) {
OutputStream outputStream = contentResolver.openOutputStream(uri);
if (outputStream != null) {
// 写入文件数据
outputStream.write(data);
outputStream.close();
}
}
} catch (IOException e) {
e.printStackTrace();
}
以上示例使用了 MediaStore API,将图片数据写入外部存储。不同类型的文件可能需要使用不同的 API 进行处理。
甘特图
下面是一个使用 mermaid 语法绘制的甘特图,展示了实现 Android 11 文件存储权限的时间分配情况。
gantt