2017-05-26 128 views
0

当用户选择文件夹而不是文件时,我希望能够从DocumentFile访问文件列表。我打电话这样的意图:浏览从Intent检索的Uri文件夹的内容.ACTION_OPEN_DOCUMENT

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); 

(neverming的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(); 
     } 

然而,当我尝试读取的URI,有两种情况: (ⅰ)当前URI “是文件”,以及(ii)CURENT URI “是一个文件夹”

编辑:正如我所知道的,情况(ii)不是默认行为。 (多重选择模式) 我可以longtapping文件夹复制本 - 万一(我)

,我可以这样做:,并与东西合作。问题是在(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(将失败的其他情况)

+0

用户不能选择具有Intent.ACTION_OPEN_DOCUMENT一个文件夹。所以你的问题描述是错误的。 – greenapps

+0

如果'ACTION_OPEN_DOCUMENT'正在返回“文件夹”(即,“文档”实际上是一个文档树),恕我直言,这是一个错误。它应该只允许用户选择文档,即使在多选模式下也是如此。 – CommonsWare

+0

我可以通过一个文件夹(多选模式?) – pwoolvett

回答

0

这是丑陋的,但似乎这样的伎俩对我来说(我不知道它会有什么后果):

DocumentFile df = DocumentFile.fromTreeUri(getApplicationContext(),Uri.parse(uri.toString().replace("/document/", "/tree/"))) 

没有投诉!我甚至可以做df.listFiles()(这是我想要的东西,始终都是!)

编辑:抱怨Nº1:该文件夹可持久URI权限是必需

+0

你可以做到这一点,而没有采取永久性的URI文件夹的URI权限?或者为父文件夹? – greenapps

+0

touché!事实上,坚持不懈的许可是一项要求。我只是测试数据清除+卸载和重新安装应用程序,生成不存在的DocumentFile! – pwoolvett

+0

好的。很高兴知道。所以现在不要在其上构建应用程序! – greenapps