android - 使用存储访问框架 (SAF) 选择或创建外部文件

标签 android

我正在尝试在外部使用 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 似乎工作正常。

但是,如果我:

  1. 使用 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);
    
  2. 使用 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/

相关文章:

javascript - Framework7 和 Material Design : Styling not rendered

android - Travis CI 运行 python 脚本

android - 配置更改后或启动这些操作的 Activity 被破坏后,SQLite CRUD 操作的预期行为是什么?

android - 如何使接口(interface)的具体实现在库范围之外不可访问?

android - 如何设置两个布局的高度。?

java - 在 greenDAO 中使用 WHERE OR 选择多个元素的简单解决方案?

java - 如何使用 libgdx 绘制边界线内的图像部分?

android - 在多个模拟器上运行 Android 应用程序的雄心勃勃的尝试 - 无法停止模拟器

没有剪辑的android ProgressBar?

android - 如何将 Android 模拟器附加到 ADB?