【问题标题】:Get File Uri from Document Id in Storage Access Framework从存储访问框架中的文档 ID 获取文件 Uri
【发布时间】:2025-12-06 02:55:01
【问题描述】:

我正在使用Google Sample 中描述的目录选择。它确实提供了所选目录的子目录的文件名和 mime 类型。如果我在光标查询上使用COLUMN_DOCUMENT_ID,我也可以获得文件的文档 ID。 我对孩子的文件 URI 感兴趣。当我使用ACTION_OPEN_DOCUMENT 而不是ACTION_OPEN_DOCUMENT_TREE 时,我很容易得到子uri,它是通过添加%2Fchildfile.extention 获得的(%2F 只是一个正斜杠)。所以我尝试使用以下代码获取子文件 uri -

uri = Uri.parse(docUri.toString()+"%2F"+fileName);

我得到了文件名,但是当我对其运行 exists() 方法时(通过将其转换为 DocumentFile),它返回 false。这意味着,要么我没有文件的权限,要么这不是获取孩子 uri 的正确方法。

我在这里遗漏了什么,还是有任何其他方法可以选择一个文件夹并轻松获取所有子文件夹的文件 uri。

PS:我目前正在Marshamallow中检查它。

【问题讨论】:

    标签: android android-5.0-lollipop android-6.0-marshmallow android-file storage-access-framework


    【解决方案1】:

    在阅读了文档并尝试了某些示例后,我得到了以下方法从选定的 docUri/treeUri 获取单个文件 Uri

    uri = DocumentsContract.buildDocumentUriUsingTree(docUri,docId);
    

    然后您可以随时使用以下代码将其转换为 DocumentFile -

    DocumentFile file = null;
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
       if (DocumentsContract.isDocumentUri(context, uri)) {
           file = DocumentFile.fromSingleUri(context, uri);
       } else {
           file = DocumentFile.fromTreeUri(context, uri);
       }
    }
    

    选择的树目录需要fromTreeUri()方法,所以它可以在file.exists()方法调用时返回true。
    你需要记住,如果孩子包含任何目录,那么你不能在上面调用childDirectory.listFiles()。它会给出UnsupportedOperationException,因为您没有访问子目录文件的权限。阅读更多关于此here 的信息。

    【讨论】: