Android Q (10) 请求访问所有存储的权限。分区存储

新手上路,请多包涵

在 Android 10 中,需要访问存储的应用程序需要请求访问具体路径的权限。但是像文件浏览器这样的应用程序可以请求访问根存储的权限并获得读取/写入所有存储的权限。这就是我想要做的。

根据 Android,我们必须为此使用 ACTION_OPEN_DOCUMENT_TREE 。我遇到的问题是一切似乎都是正确的,但没有授予该应用程序权限。

   private void askAndroid10Perm()
    {
        Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE);
        intent.addFlags(
                Intent.FLAG_GRANT_READ_URI_PERMISSION
                        | Intent.FLAG_GRANT_WRITE_URI_PERMISSION
                        | Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION
                        | Intent.FLAG_GRANT_PREFIX_URI_PERMISSION);
        startActivityForResult(intent, REQUEST_CODE_OPEN_DOCUMENT_TREE);
    }

在这里用户可以看到安卓文件树,选择主存储,点击授予权限。 “它将允许 - 应用程序名称 - 可以完全访问当前存储在此位置下的所有文件,以及存储在这里的任何未来内容” -> 允许

然后:

 @Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    switch (requestCode) {
        case REQUEST_CODE_OPEN_DOCUMENT_TREE:
            if (resultCode == Activity.RESULT_OK) {
                Uri treeUri = data.getData();
                int takeFlags = data.getFlags();
                takeFlags &= (Intent.FLAG_GRANT_READ_URI_PERMISSION |
                        Intent.FLAG_GRANT_WRITE_URI_PERMISSION);

                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {

                    Log.i("TAG", "takePersistableUriPermission: " + treeUri);
                    this.getContentResolver().takePersistableUriPermission(treeUri, takeFlags);

                }

            }
    }
}

日志:

获取PersistableUriPermission: content://com.android.externalstorage.documents/tree/primary%3A

然后应用程序仍然没有权限访问 root。

打开失败:EACCES(权限被拒绝)

当然,我有:

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

由用户授予。

原文由 user2983041 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 823
1 个回答

在清单中添加行

<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:requestLegacyExternalStorage="true" //Add this Line
    android:label="@string/app_name">

---------<Activity, Sevices or Recivers>----------

</application>

原文由 D_K 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题