返回

文件读写权限—Android 11及以上申请指南

Android

Android 11 中的文件管理权限变更:应用访问权限指南

Android 11 的文件管理权限变更概述

Android 11 及更高版本对应用程序的文件读写权限进行了重大修改。默认情况下,应用程序只能读写自己的目录。这意味着应用程序不能再像以前那样随意访问设备上的其他文件和目录。如果应用程序需要访问其他文件或目录,必须先向用户请求文件读写权限。

申请文件读写权限的步骤

要申请文件读写权限,请遵循以下步骤:

  1. 在 AndroidManifest.xml 文件中声明文件读写权限。

  2. 在代码中请求文件读写权限。

  3. 处理用户对权限请求的响应。

在 AndroidManifest.xml 文件中声明文件读写权限

在 AndroidManifest.xml 文件中声明文件读写权限以让系统知道您的应用程序需要这些权限。

<manifest ... >
  <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
  <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
</manifest>

在代码中请求文件读写权限

在代码中,使用 ContextCompat.checkSelfPermission() 方法检查应用程序是否已获得文件读写权限。如果应用程序没有这些权限,请使用 ActivityCompat.requestPermissions() 方法向用户请求权限。

if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED ||
    ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
  ActivityCompat.requestPermissions(this, arrayOf(Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE), 1);
}

处理用户对权限请求的响应

在用户对权限请求做出响应后,在 onRequestPermissionsResult() 回调方法中处理响应。

override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray) {
  super.onRequestPermissionsResult(requestCode, permissions, grantResults)
  if (requestCode == 1) {
    if (grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED && grantResults[1] == PackageManager.PERMISSION_GRANTED) {
      // 文件读写权限已授予
    } else {
      // 文件读写权限被拒绝
    }
  }
}

常见问题解答

1. 为什么我的应用程序在申请文件读写权限时会被拒绝?

这可能是因为用户之前拒绝了应用程序的文件读写权限请求。您可以通过在应用程序中提供更详细的解释来提高用户授予文件读写权限的可能性。

2. 我的应用程序已经申请了文件读写权限,但仍然无法访问其他文件和目录。这是为什么?

您可能需要在代码中明确地请求对特定文件或目录的访问权限。您可以使用以下代码来请求对特定文件的访问权限:

val uri = Uri.parse("content://media/external/images/media/123")
val intent = Intent(Intent.ACTION_OPEN_DOCUMENT).apply {
  setDataAndType(uri, "image/*")
}
startActivityForResult(intent, 1)

您可以使用以下代码来请求对特定目录的访问权限:

val intent = Intent(Intent.ACTION_OPEN_DOCUMENT_TREE)
startActivityForResult(intent, 1)

3. 我可以请求多个文件的访问权限吗?

是的,您可以在单个权限请求中请求多个文件的访问权限。例如,要请求对图像和视频文件的访问权限,可以使用以下代码:

ActivityCompat.requestPermissions(this, arrayOf(Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE), 1);

4. 如何检查应用程序是否具有文件读写权限?

您可以使用 ContextCompat.checkSelfPermission() 方法检查应用程序是否已获得文件读写权限。该方法返回 PackageManager.PERMISSION_GRANTED 或 PackageManager.PERMISSION_DENIED。

5. 如何在不使用权限的情况下访问文件?

如果应用程序不需要修改文件,则可以使用内容提供程序来访问文件。内容提供程序提供了一种方法来访问其他应用程序创建的文件,而无需请求文件读写权限。