Android 13权限新政:应用程序读写外部存储的那些事
2023-02-09 05:07:53
Android 13 的外部存储权限新政:应用程序该如何应对?
取消 WRITE_EXTERNAL_STORAGE 权限
Android 13 告别了 WRITE_EXTERNAL_STORAGE 权限,这是应用程序用于在外部存储上读写文件和目录的旧权限。这种权限开放的方式被视为对用户隐私和安全构成的风险。
引入 MANAGE_EXTERNAL_STORAGE 权限
MANAGE_EXTERNAL_STORAGE 权限取代了 WRITE_EXTERNAL_STORAGE 权限,但具有更严格的限制。应用程序必须向用户明确说明请求此权限的原因,并且用户必须明确授予权限。
应用程序如何适应?
应用程序有三种主要方法可以适应 Android 13 的新权限政策:
-
申请 MANAGE_EXTERNAL_STORAGE 权限: 应用程序可以使用 AndroidManifest.xml 文件声明权限,并在运行时向用户请求权限。请务必明确向用户说明请求权限的原因。
-
使用 Storage Access Framework (SAF): SAF 是 Android 中用于访问外部存储的框架。应用程序可以使用 SAF 读写外部存储上的文件和目录,而无需申请 MANAGE_EXTERNAL_STORAGE 权限。
-
将数据存储在私有目录中: 应用程序可以将数据存储在自己的私有目录中,不需要任何外部存储权限。
对应用程序的影响
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. 新政策对我的应用程序有什么影响?
应用程序必须适应新政策,否则无法访问外部存储。