设置初始位置中的 ACTION_OPEN_DOCUMENT_TREE 错误

时间:2021-03-29 13:18:29

标签: android

Android API 21 引入了称为 SAF(存储访问框架)的新框架,用于接收对存储的访问。在 API 30 之后,这是让您的应用访问外部存储的唯一可能解决方案。

在使用 ACTION_OPEN_DOCUMENT_TREE 意图时,我在该框架中遇到了 2 个错误 (?)。

  1. 在用户授予应用访问所需文件夹的权限后,如果 Uri 成为此 Intent 的所有下一次调用的初始位置,则 DocumentsContract.EXTRA_INITIAL_URI 将被完全忽略。
  2. 在此意图的所有下一次调用中,对于初始文件夹,按钮“使用此文件夹”是隐藏的。要选择相同的文件夹,用户需要上到父目录,然后返回,只有在这种情况下才会出现按钮。

有人遇到同样的问题吗?

我的代码:

 public void openDirectory() {
    Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE);
    intent.putExtra(DocumentsContract.EXTRA_INITIAL_URI, "content://com.android.externalstorage.documents/tree/2C13-1335%3AMusic");
    startActivityForResult(intent, FOLDER_ACCESS_REQUEST_CODE);
}

@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == FOLDER_ACCESS_REQUEST_CODE && resultCode == RESULT_OK) {           
        if (data != null) {
            Uri uri = data.getData();  // there i receive uri of selected folder, it is "content://com.android.externalstorage.documents/tree/2C13-1335%3AMusic"
            getContentResolver().takePersistableUriPermission(uri,
                    Intent.FLAG_GRANT_READ_URI_PERMISSION |
                            Intent.FLAG_GRANT_WRITE_URI_PERMISSION);

        }
}

使用此代码,两个错误都存在。如果代替

 intent.putExtra(DocumentsContract.EXTRA_INITIAL_URI, "content://com.android.externalstorage.documents/tree/2C13-1335%3AMusic");

我写

intent.putExtra(DocumentsContract.EXTRA_INITIAL_URI, "content://com.android.externalstorage.documents/document/primary:");

Explorer 在内部存储中打开并且按钮可见,即两个错误都不存在。如果我写

intent.putExtra(DocumentsContract.EXTRA_INITIAL_URI, "content://com.android.externalstorage.documents/document/secondary:");

资源管理器在缓存(即最后选择的)文件夹中打开,但按钮存在,所以我只有第一个错误

0 个答案:

没有答案