相关疑难解决方法(0)

使用 MTP 通过 Android Storage Access Framework/DocumentProvider 遍历目录层次结构的问题

更新:我最初的问题可能具有误导性,所以我想重新表述它:我想通过 Android 的存储访问框架从 MTP 连接的设备遍历层次树。我似乎无法实现这一点,因为我得到一个SecurityException声明,即子节点不是其父节点的后代。有没有办法解决这个问题?或者这是一个已知问题?谢谢。

我正在编写一个 Android 应用程序,该应用程序尝试使用 Android 的存储访问框架 (SAF) 通过MtpDocumentsProvider. 我或多或少遵循https://github.com/googlesamples/android-DirectorySelection 中描述的代码示例,了解如何从我的应用程序启动 SAF Picker,选择 MTP 数据源,然后在onActivityResult中使用返回Uri的遍历层次结构。不幸的是,这似乎不起作用,因为一旦我访问一个子文件夹并尝试遍历它,我总是得到一个SecurityException说明document xx is not a descendant of yy

所以我的问题是,使用MtpDocumentProvider,如何从我的应用程序成功遍历层次结构树并避免此异常?

具体来说,在我的应用程序中,我首先调用以下方法来启动 SAF Picker:

private void launchStoragePicker() {
    Intent browseIntent = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE);
    browseIntent.addFlags(
        Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION
            | Intent.FLAG_GRANT_PREFIX_URI_PERMISSION
            | Intent.FLAG_GRANT_READ_URI_PERMISSION
            | Intent.FLAG_GRANT_WRITE_URI_PERMISSION
    );
    startActivityForResult(browseIntent, REQUEST_CODE_OPEN_DIRECTORY);
}
Run Code Online (Sandbox Code Playgroud)

然后 Android SAF 选择器启动,我看到我连接的设备被识别为 MTP 数据源。我选择了上述数据源,然后Uri从我的onActivityResult

@Override
public void onActivityResult(int requestCode, …
Run Code Online (Sandbox Code Playgroud)

android mtp android-external-storage storage-access-framework document-provider

7
推荐指数
1
解决办法
2455
查看次数

对子目录 DocumentFile 对象的 Uri 调用 DocumentFile.fromTreeUri() 时出现意外行为

如果我调用 DocumentFile.fromTreeUri()主目录并列出其内容,它会DocumentFile按预期返回与目录中包含的文件夹和文件相关的所有对象,但是当我尝试调用DocumentFile.fromTreeUri()其中Uri的文件夹之一时DocumentFile,而不是返回所有DocumentFile相关对象按预期返回到子目录中包含的文件夹和文件,它实际上返回与其根目录上的调用完全相同的内容Uri

例如,我有一个包含 3 个文件的下载文件夹和一个包含 2 个文件的子文件夹,其结构如下

Download
-->file1
-->file2
-->file3
-->Subfolder
----->subfile1
----->subfile2
Run Code Online (Sandbox Code Playgroud)

如果我调用 通过意图回调选择的DocumentFile.fromTreeUri().listFiles()下载文件夹 它会返回我Uricontent://com.android.externalstorage.documents/tree/primary%3ADownload

-->file1
-->file2
-->file3
-->Subfolder
Run Code Online (Sandbox Code Playgroud)

到目前为止一切都很好,现在如果我尝试获取Uri与调用DocumentFile相关的对象,我得到的显然看起来是正确的,但是如果我调用它,当我列出它的内容时我会再次得到Subfoldermysub.getUri()content://com.android.externalstorage.documents/tree/primary%3ADownload/document/primary%3ADownload%2FSubfolderDocumentFile.fromTreeUri().listFiles()

-->file1
-->file2
-->file3
-->Subfolder
Run Code Online (Sandbox Code Playgroud)

与主下载文件夹 Uri 上的调用完全相同。如果我直接打电话,也会发生同样的情况mysub.listFiles()。这看起来是一个完全不合逻辑的设计。

我怎样才能真正从与其父DocumentFile文件夹相关的对象中正确获取与子文件夹相关的对象DocumentFile,以便子文件夹DocumentFile可以列出其内容而不是其父文件夹的内容?

android storage-access-framework android-10.0 android-11

4
推荐指数
1
解决办法
1408
查看次数