Android OPEN_DOCUMENT_TREE意图根位置

时间:2015-02-22 21:57:45

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

我正在使用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);

我得到以下弹出窗口:

enter image description here

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

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

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

enter image description here

我在Android 5.0.1 Nexus Tab 10中测试它。为什么我使用ACTION_OPEN_DOCUMENT_TREE和ACTION_OPEN_DOCUMENT来获取不同的根位置?也许只有内部存储文档提供程序实例支持子树选择?

我还希望允许用户使用ACTION_OPEN_DOCUMENT_TREE选择Google云端硬盘目录。

ACTION_OPEN_DOCUMENT_TREE和ACTION_OPEN_DOCUMENT引用say

  

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

非常感谢您提前

4 个答案:

答案 0 :(得分:4)

我的结果与您的结果非常相似,也就是说,无法在Google云端硬盘上选择子树。

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

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

答案 1 :(得分: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);

这是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
                        */
                }
            }
        }
    }

我希望这对将来有帮助。...

答案 2 :(得分:0)

这些年来仍然不受支持...

答案 3 :(得分:0)

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

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

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