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); 

然后你就利用这个列表。

然后恢复原码

谁在不告知的情况下更改了它?

当然你可以修改这个函数使其递归。

不错的运动 ;-).