实现 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