在授予SD卡根权限后,没有权限子文件夹使用DocumentFile写入文件

时间:2017-10-22 07:13:55

标签: android android-external-storage documentfile

我用这个打电话给意图:

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

然后选择外部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));
    }
}

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

我现在没有做任何想要确定我有权限的文件夹,我只是创建一个POC并尝试将文件写入我选择并授予权限的文件夹的子文件夹。我在下面的目标变量的DocumentFile对象上得到一个null异常:

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

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

我错过了什么?

TIA

编辑:我也尝试在我的URI中使用URL编码字符作为斜杠,但仍然不起作用,除非我直接用另一个调用我的意图选择子文件夹。

1 个答案:

答案 0 :(得分:0)

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