返回

Android 13权限新政:应用程序读写外部存储的那些事

Android

Android 13 的外部存储权限新政:应用程序该如何应对?

取消 WRITE_EXTERNAL_STORAGE 权限

Android 13 告别了 WRITE_EXTERNAL_STORAGE 权限,这是应用程序用于在外部存储上读写文件和目录的旧权限。这种权限开放的方式被视为对用户隐私和安全构成的风险。

引入 MANAGE_EXTERNAL_STORAGE 权限

MANAGE_EXTERNAL_STORAGE 权限取代了 WRITE_EXTERNAL_STORAGE 权限,但具有更严格的限制。应用程序必须向用户明确说明请求此权限的原因,并且用户必须明确授予权限。

应用程序如何适应?

应用程序有三种主要方法可以适应 Android 13 的新权限政策:

  1. 申请 MANAGE_EXTERNAL_STORAGE 权限: 应用程序可以使用 AndroidManifest.xml 文件声明权限,并在运行时向用户请求权限。请务必明确向用户说明请求权限的原因。

  2. 使用 Storage Access Framework (SAF): SAF 是 Android 中用于访问外部存储的框架。应用程序可以使用 SAF 读写外部存储上的文件和目录,而无需申请 MANAGE_EXTERNAL_STORAGE 权限。

  3. 将数据存储在私有目录中: 应用程序可以将数据存储在自己的私有目录中,不需要任何外部存储权限。

对应用程序的影响

Android 13 的新权限政策对应用程序有以下影响:

  • 应用程序必须适应新政策,否则无法访问外部存储。
  • 应用程序必须请求 MANAGE_EXTERNAL_STORAGE 权限,这可能会影响用户体验。
  • 应用程序必须使用 SAF 或将数据存储在私有目录中。

代码示例

// 申请 MANAGE_EXTERNAL_STORAGE 权限
if (ContextCompat.checkSelfPermission(context, Manifest.permission.MANAGE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
    ActivityCompat.requestPermissions(activity, arrayOf(Manifest.permission.MANAGE_EXTERNAL_STORAGE), 100);
}

// 使用 SAF 读写外部存储
val intent = Intent(Intent.ACTION_OPEN_DOCUMENT_TREE);
startActivityForResult(intent, 101);

// 将数据存储在私有目录中
val path = context.getExternalFilesDir("myData")!!
val file = File(path, "myData.txt")
file.writeText("Hello world!")

常见问题解答

1. 什么是 Android 13 的外部存储权限新政?

新政策取消了 WRITE_EXTERNAL_STORAGE 权限,并引入了更严格的 MANAGE_EXTERNAL_STORAGE 权限。

2. 为什么引入这些新政策?

为了提高用户隐私和安全。

3. 应用程序如何申请 MANAGE_EXTERNAL_STORAGE 权限?

通过 AndroidManifest.xml 文件声明权限,并在运行时向用户请求权限。

4. 我应该使用 SAF 还是私有目录来访问外部存储?

取决于应用程序的特定需求和用户体验。

5. 新政策对我的应用程序有什么影响?

应用程序必须适应新政策,否则无法访问外部存储。