【问题标题】:Android OPEN_DOCUMENT_TREE intent root locationsAndroid OPEN_DOCUMENT_TREE Intent 根位置
【发布时间】:2015-04-24 04:27:56
【问题描述】:

我正在使用在 Android 5.0(API 级别 21)中引入的 Directory Selection API 让用户选择一个目录来保存文件。

要选择我构建的目录并发送 ACTION_OPEN_DOCUMENT_TREE 意图,如下代码所示:

Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE);
startActivityForResult(intent, REQUEST_CODE_OPEN_DIRECTORY);

我得到以下弹出窗口:

但是,如果我让用户使用 ACTION_OPEN_DOCUMENT 意图选择文件:

Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
intent.addCategory(Intent.CATEGORY_OPENABLE);
intent.setType("*/*");
startActivityForResult(intent, FILE_CHOOSER_ACTIVITY_REQUEST_CODE);

然后,我得到以下弹出窗口:

我在我的 Android 5.0.1 Nexus Tab 10 中对其进行测试。为什么我使用 ACTION_OPEN_DOCUMENT_TREE 和 ACTION_OPEN_DOCUMENT 获得不同的根位置?也许只有 Internal Storage Document Provider 实例支持子树选择?

我还希望允许用户使用 ACTION_OPEN_DOCUMENT_TREE 选择 Google Drive 目录。

ACTION_OPEN_DOCUMENT_TREE 和 ACTION_OPEN_DOCUMENT 均参考say

当被调用时,系统将显示设备上安装的各种 DocumentsProvider 实例,让用户浏览它们。

非常感谢您

【问题讨论】:

    标签: android-intent google-drive-api android-5.0-lollipop storage-access-framework


    【解决方案1】:

    我的结果和你的一模一样,就是无法在Google Drive上选择子树。

    基于Android official sample 关于OPEN_DOCUMENT_TREE: 系统显示所有 DocumentsProvider支持子树选择的实例

    所以我认为原因是 Google Drive DocumentsProvider 实例还不支持句柄 OPEN_DOCUMENT_TREE。

    【讨论】:

    • 两年过去了,情况仍然如此……
    • 我认为我们有一个明显的例子,即 SAF 是一个巨大的垃圾箱火灾,即使 Google 在 5 年后都不支持它。丰富的 API 我的 ^@.
    • 五年过去了,情况仍然如此。
    【解决方案2】:

    我知道这是一个老问题,但情况还是一样。 ACTION_OPEN_DOCUMENT_TREE 打开的文件请求器没有列出 Google Drive 或 OneDrive 等提供程序,但是这些提供程序在使用 ACTION_OPEN_DOCUMENT 时会出现。

    我通过使用 ACTION_OPEN_DOCUMENT 并指定用户可以选择多个文件来解决此问题。处理选择的回调中的处理有点不同,但它适用于我。

    这是设置意图的代码:

                    Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
                    intent.addCategory(Intent.CATEGORY_OPENABLE);
                    intent.setType("image/jpeg");
                    intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true);
    
                    startActivityForResult(Intent.createChooser(intent, "Choose Photos"), RQS_OPEN_PHOTO_TREE);
    

    这里是onActivitryResult():

    @Override
        protected void onActivityResult(int requestCode, int resultCode, Intent data) {
            super.onActivityResult(requestCode, resultCode, data);
    
            if (resultCode == Activity.RESULT_OK) {
                if (requestCode == RQS_OPEN_PHOTO_TREE) {
                    ClipData clipData = data.getClipData();
                    Uri pUri = data.getData();
                    if (clipData == null && pUri == null) {
                        // No files were selected. Don't know if this can actually happen...
                        Toast.makeText(this, "No jpeg files selected", Toast.LENGTH_LONG).show();
                    } else if( clipData != null){  // User selected multiple files
                        for (int i = 0; i < clipData.getItemCount(); i++) {
                            ClipData.Item item = clipData.getItemAt(i);
                            Uri uri = item.getUri();
                            /*
                             * Process the returned Uri
                            */
                        }
                    }
                    else { 
                            /*
                             * The user only selected one file
                             * The Uri for the file is in pUri
                            */
                    }
                }
            }
        }
    

    我希望这对以后的其他人有所帮助....

    【讨论】:

      【解决方案3】:

      这么多年还是不支持...

      【讨论】:

        【解决方案4】:

        当我在寻找一种在我的应用程序中实现目录/文件选择器的方法时,经过几次搜索后,我得出结论:仅使用库比自己构建整个对话框选择器更有效。

        我最终使用了https://github.com/TutorialsAndroid/FilePicker
        它可以完成我的工作,并且易于使用且非常轻巧。

        谷歌搜索“目录选择器 android 库”将提供更多选项。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-08-21
          • 1970-01-01
          • 2016-01-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-05-31
          • 1970-01-01
          相关资源
          最近更新 更多