浏览从 Intent.ACTION_OPEN_DOCUMENT 检索到的 Uri 文件夹的内容
Explore contents of Uri Folder retrieved from Intent.ACTION_OPEN_DOCUMENT
我希望能够在用户选择文件夹而不是文件时访问 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 "is a file",以及 (ii) 当前 Uri "is a Folder"
编辑:有人告诉我,情况 (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
(对于另一种情况会失败)
它很丑,但它似乎对我有用(虽然我不知道它会产生什么后果):
DocumentFile df = DocumentFile.fromTreeUri(getApplicationContext(),Uri.parse(uri.toString().replace("/document/", "/tree/")))
没有投诉!我什至可以做到 df.listFiles()
(这是我一直想要的!)
编辑:第 1 条投诉:需要该文件夹的持久 uri 权限
我希望能够在用户选择文件夹而不是文件时访问 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 "is a file",以及 (ii) 当前 Uri "is a Folder"
编辑:有人告诉我,情况 (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
(对于另一种情况会失败)
它很丑,但它似乎对我有用(虽然我不知道它会产生什么后果):
DocumentFile df = DocumentFile.fromTreeUri(getApplicationContext(),Uri.parse(uri.toString().replace("/document/", "/tree/")))
没有投诉!我什至可以做到 df.listFiles()
(这是我一直想要的!)
编辑:第 1 条投诉:需要该文件夹的持久 uri 权限