我正在尝试在外部使用 SAF 打开现有文件或创建新文件,而无需用户安装除我的 apk 之外的任何其他内容。
在我的搭载 Android 10 的 Pixel 3 上,ACTION_OPEN_DOCUMENT_TREE 抛出一个异常,指示没有处理此问题的 Activity (我想知道为什么会这样?)。
android.content.ActivityNotFoundException:找不到处理 Intent 的 Activity { act=android.intent.action.OPEN_DOCUMENT_TREE cat=[android.intent.category.OPENABLE] typ=vnd.android.document/directory(有额外内容)}
Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE);
intent.addCategory(Intent.CATEGORY_OPENABLE);
intent.putExtra(DocumentsContract.EXTRA_INITIAL_URI, "content://com.android.externalstorage.documents/document/primary:.myfolder");
intent.setType(DocumentsContract.Document.MIME_TYPE_DIR);
activity.startActivityForResult(intent, READ_DIRECTORY_CODE);
ACTION_OPEN_DOCUMENT 和 ACTION_CREATE_DOCUMENT 似乎工作正常。
但是,如果我:
使用 ACTION_OPEN_DOCUMENT 启动 Intent ,但文件尚不存在,用户无法选择任何内容或创建新文件。
final Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT); intent.addCategory(Intent.CATEGORY_OPENABLE); intent.putExtra(DocumentsContract.EXTRA_INITIAL_URI, "content://com.android.externalstorage.documents/document/primary:.myfolder/myfile.json"); intent.putExtra(Intent.EXTRA_TITLE, "myfile.json"); intent.setType("application/json"); activity.startActivityForResult(intent, READ_DIRECTORY_CODE);
使用 ACTION_CREATE_DOCUMENT 启动 Intent 并且文件确实存在,用户只能选择创建一个覆盖旧文件的新文件。
Intent intent = new Intent(Intent.ACTION_CREATE_DOCUMENT); //Opens the create file UI intent.addCategory(Intent.CATEGORY_OPENABLE); intent.putExtra(DocumentsContract.EXTRA_INITIAL_URI, "content://com.android.externalstorage.documents/document/primary:.myfolder"); intent.putExtra(Intent.EXTRA_TITLE, "myfile.json"); intent.setType("application/json"); activity.startActivityForResult(intent, READ_DIRECTORY_CODE);
如果我能在开始 Intent 之前告诉文件夹和文件存在,我就会有一些可用的东西。 我似乎无法使用 DocumentFile.fromTreeUri(activity, uri) 让它工作 请注意,我从打开命令中获得了 URI,当时文件确实存在。 IE。 “内容://com.android.externalstorage.documents/document/primary:.myfolder” 当我尝试时,我只收到无效的 URI 异常。
try {
Uri folderUri = Uri.parse("content://com.android.externalstorage.documents/document/primary:.myfolder");
exists = DocumentFile.fromTreeUri(activity, folderUri).exists(); //This line throws the URI exception
} catch (Exception e) {
Logger.d(TAG, e.getMessage());
}
对这些障碍有什么想法吗?
最佳答案
以下@blackapps 评论为我提供了问题的 ACTION_OPEN_DOCUMENT_TREE 部分的答案。
你得到这个异常是因为语句 intent.setType(DocumentsContract.Document.MIME_TYPE_DIR);。去掉它。 CATEGORY_OPENABLE 在那里也没有用。
关于android - 使用存储访问框架 (SAF) 选择或创建外部文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58662166/