DocumentsContract 的 buildChildDocumentsUriUsingTree(uri, DocumentsContract.getTreeDocumentId(uri)); returns 父 Uri 树
DocumentsContract's buildChildDocumentsUriUsingTree(uri, DocumentsContract.getTreeDocumentId(uri)); returns parent Uri tree
我正在尝试使用 DocumentsContract 使用以下方法递归遍历目录。
void traverseDirectoryEntries(Uri rootUri) {
ContentResolver contentResolver = activityMain.getContentResolver();
Uri childrenUri = DocumentsContract.buildChildDocumentsUriUsingTree(
rootUri, DocumentsContract.getTreeDocumentId(rootUri));
List<Uri> dirNodes = new LinkedList<>();
dirNodes.add(childrenUri);
while (!dirNodes.isEmpty()) {
childrenUri = dirNodes.remove(0); // get the item from top
try (Cursor cursor = contentResolver.query(childrenUri, new String[]{
DocumentsContract.Document.COLUMN_DOCUMENT_ID,
DocumentsContract.Document.COLUMN_DISPLAY_NAME,
DocumentsContract.Document.COLUMN_MIME_TYPE},
null, null, null)) {
if (cursor != null) {
while (cursor.moveToNext()) {
final String docId = cursor.getString(0);
final String name = cursor.getString(1);
final String mime = cursor.getString(2);
if (isDirectory(mime)) {
final Uri newNode = DocumentsContract.buildChildDocumentsUriUsingTree(
rootUri, docId);
traverseDirectoryEntries(newNode);
}
}
}
}
}
}
// Util method to check if the mime type is a directory
private static boolean isDirectory(String mimeType) {
return DocumentsContract.Document.MIME_TYPE_DIR.equals(mimeType);
}
不幸的是,这不起作用。尽管传入的目录是根目录的子目录,但它一遍又一遍地遍历相同的根目录。 final Uri newNode = DocumentsContract.buildChildDocumentsUriUsingTree(rootUri, docId);
returns 行最后附有子目录的 Uri。那很好用。问题是以下行:Uri childrenUri = DocumentsContract.buildChildDocumentsUriUsingTree(rootUri, DocumentsContract.getTreeDocumentId(rootUri));
其中 rootUri 是新节点。我得到了相同的 childrenUri;我从 rootUri 得到的那个。这是一个错误吗?我做错了吗? docId错了吗?我试过 getDocumentId(rootUri)
,但会抛出错误,因为它 returns 的 id 不是一棵树。这几乎就像 getTreeDocumentId(rootUri)
正在返回 getRootId(rootUri)
应该返回的东西。有办法解决这个问题吗?
rootUri 是通过ACTION_OPEN_DOCUMENT_TREE
获得的。我在 Android Pie 上 运行 这个。我在根据数据构建树结构的地方遗漏了一些代码。
您正在滥用这个众所周知的 void traverseDirectoryEntries(Uri rootUri)
函数。
你以为它是递归的,其实不是。
删除递归调用,而是将 'newNode' 添加到列表中。
// traverseDirectoryEntries(newNode);
dirNodes.add(newNode);
然后你就利用这个列表。
然后恢复原码
谁在不告知的情况下更改了它?
当然你可以修改这个函数使其递归。
不错的运动 ;-).
我正在尝试使用 DocumentsContract 使用以下方法递归遍历目录。
void traverseDirectoryEntries(Uri rootUri) {
ContentResolver contentResolver = activityMain.getContentResolver();
Uri childrenUri = DocumentsContract.buildChildDocumentsUriUsingTree(
rootUri, DocumentsContract.getTreeDocumentId(rootUri));
List<Uri> dirNodes = new LinkedList<>();
dirNodes.add(childrenUri);
while (!dirNodes.isEmpty()) {
childrenUri = dirNodes.remove(0); // get the item from top
try (Cursor cursor = contentResolver.query(childrenUri, new String[]{
DocumentsContract.Document.COLUMN_DOCUMENT_ID,
DocumentsContract.Document.COLUMN_DISPLAY_NAME,
DocumentsContract.Document.COLUMN_MIME_TYPE},
null, null, null)) {
if (cursor != null) {
while (cursor.moveToNext()) {
final String docId = cursor.getString(0);
final String name = cursor.getString(1);
final String mime = cursor.getString(2);
if (isDirectory(mime)) {
final Uri newNode = DocumentsContract.buildChildDocumentsUriUsingTree(
rootUri, docId);
traverseDirectoryEntries(newNode);
}
}
}
}
}
}
// Util method to check if the mime type is a directory
private static boolean isDirectory(String mimeType) {
return DocumentsContract.Document.MIME_TYPE_DIR.equals(mimeType);
}
不幸的是,这不起作用。尽管传入的目录是根目录的子目录,但它一遍又一遍地遍历相同的根目录。 final Uri newNode = DocumentsContract.buildChildDocumentsUriUsingTree(rootUri, docId);
returns 行最后附有子目录的 Uri。那很好用。问题是以下行:Uri childrenUri = DocumentsContract.buildChildDocumentsUriUsingTree(rootUri, DocumentsContract.getTreeDocumentId(rootUri));
其中 rootUri 是新节点。我得到了相同的 childrenUri;我从 rootUri 得到的那个。这是一个错误吗?我做错了吗? docId错了吗?我试过 getDocumentId(rootUri)
,但会抛出错误,因为它 returns 的 id 不是一棵树。这几乎就像 getTreeDocumentId(rootUri)
正在返回 getRootId(rootUri)
应该返回的东西。有办法解决这个问题吗?
rootUri 是通过ACTION_OPEN_DOCUMENT_TREE
获得的。我在 Android Pie 上 运行 这个。我在根据数据构建树结构的地方遗漏了一些代码。
您正在滥用这个众所周知的 void traverseDirectoryEntries(Uri rootUri)
函数。
你以为它是递归的,其实不是。
删除递归调用,而是将 'newNode' 添加到列表中。
// traverseDirectoryEntries(newNode);
dirNodes.add(newNode);
然后你就利用这个列表。
然后恢复原码
谁在不告知的情况下更改了它?
当然你可以修改这个函数使其递归。
不错的运动 ;-).