从存储访问框架中的文档 ID 获取文件 URI

Get File Uri from Document Id in Storage Access Framework

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

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

我得到了文件名,但是当我在其上使用 运行 exists() 方法(通过将其转换为 DocumentFile)时,它 returns 为假。这意味着,要么我没有文件的权限,要么这不是获取 children uri 的正确方法。

我是不是遗漏了一些东西,或者有什么其他方法可以 select 一个文件夹并轻松获取所有文件夹的文件 uri children。

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

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

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() 方法,以便它可以 return 在 file.exists() 方法调用时为真。
您需要记住,如果子目录包含任何目录,则您不能对其调用 childDirectory.listFiles()。它会给出 UnsupportedOperationException,因为您没有访问子目录文件的权限。阅读更多相关信息 here