读写权限缺失?Android 10以上“读写权限被拒绝”问题详细解决
2023-04-02 13:43:04
Android 10读写权限的彻底变革:对应用开发者的影响
权限管理的革命
从Android 10开始,Google对权限管理机制进行了重大改革,旨在赋予用户对个人数据的更多控制权并防止应用滥用权限。这次变革最重大的影响之一就是对读写权限的限制。
外部存储空间访问的困境
在Android 10及之前的版本中,应用可以访问外部存储空间,以便存储数据和读取文件。然而,这一机制存在安全隐患,因为应用可以访问用户设备上所有文件,包括敏感信息。
为了解决这一问题,Android 10引入了限制,阻止应用访问外部存储空间,除非用户明确授予权限。这给许多依赖外部存储空间访问的应用带来了挑战。
解决之道:请求访问权限
要解决Android 10读写权限问题,应用开发人员可以使用以下两种方法:
1. 请求传统外部存储访问
在应用的AndroidManifest.xml文件中添加如下属性:
<manifest ...>
<application ...>
<request-legacy-external-storage android:enabled="true" />
</application>
</manifest>
这个属性告诉系统,应用需要访问外部存储空间。添加此属性后,应用将能够访问外部存储空间。
2. 使用AndroidX Storage Access Framework
AndroidX Storage Access Framework(SAF)是一个库,允许应用以更细粒度的控制请求访问外部存储空间的权限。以下步骤说明如何使用SAF:
- 在AndroidManifest.xml文件中添加权限:
<manifest ...>
<application ...>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
</application>
</manifest>
- 在应用中使用SAF请求访问权限:
Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE);
startActivityForResult(intent, REQUEST_CODE_OPEN_DOCUMENT_TREE);
- 在onActivityResult()方法中处理用户授予或拒绝权限的结果:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == REQUEST_CODE_OPEN_DOCUMENT_TREE) {
if (resultCode == RESULT_OK) {
// 用户授予了访问外部存储空间的权限
Uri uri = data.getData();
// 使用uri访问外部存储空间
} else {
// 用户拒绝了访问外部存储空间的权限
// 提示用户需要授予访问外部存储空间的权限
}
}
}
常见问题解答
-
为什么Android 10要限制读写权限?
为了增强用户对个人数据的控制权并防止应用滥用权限。 -
我的应用需要访问外部存储空间才能工作。我该怎么办?
您可以请求传统外部存储访问或使用AndroidX Storage Access Framework。 -
AndroidX Storage Access Framework的优点是什么?
它允许应用更细粒度地控制外部存储空间的访问权限。 -
传统外部存储访问和AndroidX Storage Access Framework有什么区别?
传统外部存储访问允许应用访问所有外部存储空间,而AndroidX Storage Access Framework允许应用仅访问用户授予权限的特定目录。 -
如果用户拒绝了我的应用的读写权限请求,该怎么办?
您可以提示用户授予访问权限,解释为什么您的应用需要该权限。