从Storage Access Framework中的文档ID获取文件Uri

时间:2016-09-13 07:57:13

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

我正在使用此Google Sample中所述的目录选择。它确实提供所选目录的子项的文件名和mime类型。如果我在Cursor Query上使用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。这意味着,要么我没有获得该文件的许可,要么就是没有正确的方式来获得孩子。

我在这里遗漏了什么,或者有没有其他方法可以选择一个文件夹并轻松获取所有孩子的文件。

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

1 个答案:

答案 0 :(得分: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