2017-05-26 10 views
0

ファイルの代わりにフォルダを選択すると、DocumentFileからファイルのリストにアクセスできます。Intent.ACTION_OPEN_DOCUMENTから取得したUriフォルダの内容を調べる

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

onActivityResultで、その後、 (彼らはあなたが彼らの名に期待するものですFLAG_...TYPE_...をneverming):

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を読んで、2例があります。 (ⅰ)現在のウリは、「ファイルです」と、(ii)海流ウリは

「フォルダです」編集:私は言ったように、ケース(ii)はデフォルトの動作ではありません。 (?複数選択モード) - :、とかで作業 私はフォルダをlongtappingすることでこれを再現することができ

を(i)の場合には、私がこれを行うことができます。問題は(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

を必要としています。だからあなたの問題の説明は間違っています。 – greenapps

+0

'ACTION_OPEN_DOCUMENT'が「フォルダ」(すなわち、本当に文書ツリーである「文書」)を返す場合、IMHOはバグです。複数選択モードであっても、ユーザーは文書を選択することができます。 – CommonsWare

+0

フォルダをロングタップしてこの動作を生成できます(複数選択モード?) – pwoolvett

答えて

0

それは醜いですが、それは私のためにトリックを行うように見えるということです(私はそれが持っている結果を知っていません):

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

苦情はありません!!私も(私はすべてに沿って欲しかったものである!)df.listFiles()を行う

編集することができます。Nº1を訴える:そのフォルダの永続URIの権限は、ユーザがIntent.ACTION_OPEN_DOCUMENTとフォルダを選択することはできません

+0

これは、そのフォルダに対して永続的なuri権限を持っていないとこれを行うことはできませんか?または、親フォルダですか? – greenapps

+0

touché!確かに、持続可能なuriの許可が必要です。私はちょうどデータをクリア+アンインストールし、アプリケーションを再インストールし、存在しないDocumentFileを生産してテストしました! – pwoolvett

+0

知っておくといい。だから今あなたのアプリケーションを構築しないでください! – greenapps

関連する問題