7

我正在使用 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 参考都说

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

非常感谢您提前

4

4 回答 4

8

我的结果和你的完全一样,就是不能在 Google Drive 上选择子树。

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

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

于 2015-03-20T00:46:23.983 回答
1

我知道这是一个老问题,但情况还是一样。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);

这里是 onActivtryResult():

@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
                        */
                }
            }
        }
    }

我希望这对将来的其他人有所帮助....

于 2020-01-30T13:48:10.583 回答
0

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

于 2020-02-01T11:03:35.170 回答
0

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

我最终使用了https://github.com/TutorialsAndroid/FilePicker
它在我的情况下完成了工作,它易于使用且非常轻量级。

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

于 2020-03-31T19:43:48.007 回答