浏览从Intent.ACTION_OPEN_DOCUMENT中检索到的Uri文件夹的内容

时间:2017-05-26 16:03:33

标签: android storage-access-framework documentfile

当用户选择文件夹而不是文件时,我希望能够从DocumentFile访问文件列表。我这样称呼这个意图:

Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
    intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true);
    intent.setFlags(FLAG_READ_WRITE|FLAG_PERSIST );
    intent.addCategory(Intent.CATEGORY_OPENABLE);
    intent.setType(TYPE_ANY);
    String [] mimeTypes = {TYPE_IMAGE,TYPE_VIDEO};
    intent.putExtra(Intent.EXTRA_MIME_TYPES, mimeTypes);
    startActivityForResult(intent, REQUEST_CODE_SELECT_VIDEOS);

(永远不要FLAG_...TYPE_...这些是他们对他们的名字所期望的) 然后,在onActivityResult

if (resultCode == Activity.RESULT_OK) {               
          if (resultData != null) {
                Uri uri = resultData.getData(); // try to get only one element
                if (uri!=null){ // data is available as ClipData because multiple items were selected
                    Log.i(TAG, "Uri: " + uri.toString());
                    selectedDocs.add(uri);
                }else{
                    ClipData data = resultData.getClipData();
                    for(int i=0;i<data.getItemCount();i++){
                        ClipData.Item item = data.getItemAt(i);
                        Uri aUri = item.getUri();
                        selectedDocs.add(aUri);
                    }
                    Log.i(TAG, "handleReadRequestResult: data=" + data.toString());
                }
            }else{
                Log.e(TAG, "handleReadRequestResult: resultData is null");
                handleIssues();
            }
        }else{
            Log.e(TAG, "handleReadRequestResult: resultCode is not OK");
            handleIssues();
        }

但是,当我尝试阅读uris时,有两种情况: (i)当前的Uri“是一个文件”,(ii)curent Uri“是一个文件夹”

编辑:据我所知,案例(ii)不是默认行为。 我可以通过长篇文件夹(多选模式?)重现这一点吗? -

在情况(i)中,我可以这样做:DocumentFile.fromSingleUri(getApplicationContext(),uri),并使用这些东西。问题是在(ii)的情况下,我想列出可用的文件。

注意:在致电new Intent(Intent.ACTION_OPEN_DOCUMENT)时,我得到uri.toString()=content://com.android.externalstorage.documents/document/BEAE-19F8%3AFolderName,但是new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE),我得到uri.toString()=content://com.android.externalstorage.documents/tree/BEAE-19F8%3AFolderName

这里的区别在于,当意图是Intent.ACTION_OPEN_DOCUMENT_TREE时,我可以DocumentFile df = DocumentFile.fromTreeUri(getApplicationContext(),uri),然后df.listFiles(对于其他情况会失败)

1 个答案:

答案 0 :(得分:0)

这很难看,但它似乎对我有用(我不知道它会带来的后果):

DocumentFile df = DocumentFile.fromTreeUri(getApplicationContext(),Uri.parse(uri.toString().replace("/document/", "/tree/")))
没抱怨!!我甚至可以做df.listFiles()(这是我一直想要的!)

编辑:抱怨Nº1:需要该文件夹的可持久uri权限