3

显然,“文件选择器”应用程序并没有完全实现 ACTION_OPEN_DOCUMENT_TREE 意图。

假设这段代码被执行:

 Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE);
            intent.addFlags(Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION);
            intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
            intent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
            intent.setType("vnd.android.document/directory");
            intent.addCategory(Intent.CATEGORY_OPENABLE);
            startActivityForResult(intent, OPEN_DIRECTORY_REQUEST_CODE);

发出此错误:

android.content.ActivityNotFoundException: No Activity found to handle Intent { act=android.intent.action.OPEN_DOCUMENT_TREE cat=[android.intent.category.OPENABLE] typ=vnd.android.document/directory flg=0x43 }

与此替代类型“application/vnd.google-apps.folder”相同

或不包括添加 OPENABLE 类别的行

或使用intent.setType(DocumentsContract.Document.MIME_TYPE_DIR);

而如果执行此代码:

 Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE);
            intent.addFlags(Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION);
            intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
            intent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
            startActivityForResult(intent, OPEN_DIRECTORY_REQUEST_CODE);

没有错误,但只有磁盘根可供用户选择,因此不显示云空间。

如果 ACTION_OPEN_DOCUMENT 像这样使用:

            Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
            intent.addFlags(Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION);
            intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
            intent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
            intent.setType("*/*");
            intent.addCategory(Intent.CATEGORY_OPENABLE);
            startActivityForResult(intent, OPEN_FILE_REQUEST_CODE);

云根(仅 Drive 云域,我认为唯一实现 SAF 的应用程序)可用并且可以选择文件。

我进行了实验并实现了存储访问框架。例如看这个问题:

存储访问框架 - 无法从 uri 获取文档树(从 Drive 应用程序返回)

您可以在其中看到该功能存在,尽管它有点像 hack,指的是创建文件夹,而不是选择它(文件夹应该是“文档树”)。

我想我必须找到正确的 mime 类型,那会是什么?我看到很多时候,当意图有一些错误的类型或标志时会出现错误,但是当找到正确的参数时它会起作用。

否则,如何正式要求谷歌让 SAF 的“文件选择器”应用程序正确实现云域的 ACTION_OPEN_DOCUMENT_TREE 意图,由他们自己为 Android 上的存储访问框架创建?实际上,我希望它已经实施。

4

0 回答 0