授予SD卡root权限后,子文件夹无法使用DocumentFile写入文件

No permission to subfolders to write files with DocumentFile after granting permission to root of SD Card

我正在调用一个意图:

Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE);
intent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
startActivityForResult(intent, 42);

和select获取我的外置SD卡的根目录,然后使用这个获取持久权限:

    @Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == 42) {
        Uri treeUri = data.getData();
        this.getContentResolver().takePersistableUriPermission(treeUri, (Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION));
    }
}

我可以使用输出流将文件写入根目录(我的初始 selection),但我不能写入任何其他子文件夹,除非我再次明确地请求它们的权限 select他们。

我现在没有做任何花哨的事情来确定我有权访问哪些文件夹,我只是创建一个 POC 并尝试将文件写入我拥有 select 的文件夹的子文件夹,并且授予权限。我在下面的目标变量的 DocumentFile 对象上得到一个空异常:

DocumentFile dir = DocumentFile.fromTreeUri(cont, Uri.parse(myUriToRoot+"/subfolder"));
    DocumentFile destination = dir.createFile("image/jpeg", "myfile.jpg");

同样,如果我明确授予该子文件夹的权限,它就可以工作。我读过的所有内容都说,所有现有的子文件夹和您授予权限的文件夹下的任何新创建的文件夹都应该允许访问写入文件,但它对我不起作用。

我错过了什么?

TIA

编辑:我也尝试过在我的 URI 中使用 URL 编码字符作为斜杠,但仍然不起作用,除非我直接 select 子文件夹并再次调用我的意图。

我解决了这个问题,方法不是直接将 fromTreeUri() 方法设置到子文件夹,而是将其保留在根目录,然后在另一个 DocumentFile 对象上使用 findFile,然后在下一个 DocumentFile 对象上使用 createFile。