1

我正在使用此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中检查它。

4

1 回答 1

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,因为您无权访问子目录的文件。在此处阅读有关此内容的更多信息。

于 2016-09-13T13:12:14.343 回答