显然,“文件选择器”应用程序并没有完全实现 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 上的存储访问框架创建?实际上,我希望它已经实施。