Android11 已有MANAGE_EXTERNAL_STORAGE 但还是没有WRITE_EXTERNAL_STORAGE权限

在Android 11中,新增了MANAGE_EXTERNAL_STORAGE权限,用于控制应用对外部存储的管理权限。但是,WRITE_EXTERNAL_STORAGE权限仍然没有被引入,这意味着应用仍然无法直接向外部存储写入数据。在这篇科普文章中,我们将探讨Android 11中的存储权限管理情况,并提供一些解决方案。

存储权限变更

在Android 10及之前的版本中,我们可以通过向Manifest文件中添加以下代码来请求写入外部存储的权限:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
  • 1.

但是在Android 11中,WRITE_EXTERNAL_STORAGE权限被废弃,取而代之的是MANAGE_EXTERNAL_STORAGE权限。这意味着应用无法直接请求写入外部存储的权限,而是需要经过系统级的管理来进行存储操作。

使用MANAGE_EXTERNAL_STORAGE权限

要在Android 11中使用外部存储,我们需要请求MANAGE_EXTERNAL_STORAGE权限,并在Manifest文件中声明以下权限:

<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE"/>
  • 1.

此权限允许应用管理外部存储,包括读取和删除外部存储中的文件。但是,仍然无法直接写入外部存储。

解决方案

虽然无法直接向外部存储写入数据,但我们可以通过以下方法来绕过这一限制:

  1. 使用MediaStore API:通过MediaStore API可以向外部存储的特定目录写入文件。以下是一个简单的示例:
ContentValues values = new ContentValues();
values.put(MediaStore.MediaColumns.DISPLAY_NAME, "example.jpg");
values.put(MediaStore.MediaColumns.MIME_TYPE, "image/jpeg");
values.put(MediaStore.MediaColumns.RELATIVE_PATH, Environment.DIRECTORY_PICTURES);

Uri uri = getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
try {
    OutputStream outputStream = getContentResolver().openOutputStream(uri);
    // 写入数据到外部存储
    outputStream.close();
} catch (IOException e) {
    e.printStackTrace();
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  1. 使用SAF(Storage Access Framework):SAF提供了一个标准化的界面,用于访问设备上的文件。以下是一个使用SAF保存文件到外部存储的示例:
Intent intent = new Intent(Intent.ACTION_CREATE_DOCUMENT);
intent.addCategory(Intent.CATEGORY_OPENABLE);
intent.setType("image/jpeg");
intent.putExtra(Intent.EXTRA_TITLE, "example.jpg");

startActivityForResult(intent, REQUEST_CODE_CREATE_DOCUMENT);
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == REQUEST_CODE_CREATE_DOCUMENT && resultCode == RESULT_OK) {
        Uri uri = data.getData();
        try {
            OutputStream outputStream = getContentResolver().openOutputStream(uri);
            // 写入数据到外部存储
            outputStream.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.

序列图示例

下面是一个简单的序列图示例,展示了应用向外部存储写入数据的过程:

ExternalStorage System App ExternalStorage System App 请求写入外部存储权限 授权MANAGE_EXTERNAL_STORAGE权限 请求写入文件到外部存储 写入文件 返回成功 返回成功

结语

尽管Android 11中没有引入WRITE_EXTERNAL_STORAGE权限,但通过MANAGE_EXTERNAL_STORAGE权限、MediaStore API和SAF,我们仍然可以在应用中使用外部存储。希望这篇文章可以帮助你更好地了解Android 11中的存储权限管理情况,并找到解决方案来处理外部存储的操作。如果你有任何疑问或建议,请随时在评论区留言,我们将尽快回复。谢谢阅读!