返回

读写权限缺失?Android 10以上“读写权限被拒绝”问题详细解决

Android

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:

  1. 在AndroidManifest.xml文件中添加权限:
<manifest ...>
    <application ...>
        <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
        <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    </application>
</manifest>
  1. 在应用中使用SAF请求访问权限:
Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE);
startActivityForResult(intent, REQUEST_CODE_OPEN_DOCUMENT_TREE);
  1. 在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允许应用仅访问用户授予权限的特定目录。

  • 如果用户拒绝了我的应用的读写权限请求,该怎么办?
    您可以提示用户授予访问权限,解释为什么您的应用需要该权限。