android - 探索从 Intent.ACTION_OPEN_DOCUMENT 检索到的 Uri 文件夹的内容

标签 android storage-access-framework documentfile

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

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) 当前 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 是 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 权限

关于android - 探索从 Intent.ACTION_OPEN_DOCUMENT 检索到的 Uri 文件夹的内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44205833/

相关文章:

java - Android 项目中的 .java 文件的 Ensime

java - 在 RecyclerView 中加载 WebView 时显示进度

android - 权限拒绝 : get/set setting for user asks to run as user -2 but is calling from user 0

java - 使用存储访问框架打开特定路径

android - 从 URI 创建可写的 DocumentFile

android - 使用 arrayadapter 过滤 ListView

java - 从 SAF 内容 URI 中提取文件名

android - 在 Android 中从 File Api 迁移到 Storage Access Framework (SAF)

java - Java 文件和文档文件的区别

android - 在 Lollipop 上使用 Android 存储访问框架列出文件时出现错误