Android:如何获得可移动sd卡的永久写入权限?

Android:如何获得可移动sd卡的永久写入权限?,android,android-permissions,android-sdcard,documentfile,Android,Android Permissions,Android Sdcard,Documentfile,在过去的几天里,我浏览了一下存储访问框架,但仍然没有理解它 我的问题是:在选择sd卡位置一次后,如果不提示选择路径,如何在sd卡上创建具有这些权限的文件 我可以在sd卡上选择一个路径,用下面的代码创建一个文件。(行得通) 在活动结果中,我是这样做的 @Override public void onActivityResult(int requestCode, int resultCode, Intent resultData){ if(resultCode!=RESULT_OK)

在过去的几天里,我浏览了一下存储访问框架,但仍然没有理解它

我的问题是:在选择sd卡位置一次后,如果不提示选择路径,如何在sd卡上创建具有这些权限的文件

我可以在sd卡上选择一个路径,用下面的代码创建一个文件。(行得通)

在活动结果中,我是这样做的

@Override
public void onActivityResult(int requestCode, int resultCode, Intent resultData){

    if(resultCode!=RESULT_OK)
        return;
    Uri treeUri=resultData.getData();
    pickedDir= DocumentFile.fromTreeUri(getContext(), treeUri);
    getContext().grantUriPermission(getContext().getPackageName(), treeUri, Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
    getContext().getContentResolver().takePersistableUriPermission(treeUri, Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION );

    writeFile(pickedDir, "testfile.txt");

}

public void writeFile(DocumentFile pickedDir, String filename) {
    try {
        DocumentFile file = pickedDir.createFile("text/plain", filename);
        OutputStream out = getContext().getContentResolver().openOutputStream(file.getUri());
        try {
            // write the file content
        } finally {
            out.close();
        }

    } catch (IOException e) {
        throw new RuntimeException("Something went wrong : " + e.getMessage(), e);
    }
}
保存treeUri以供进一步使用。供以后使用

您可以将treeUri.toString()保存为共享首选项中的内容方案路径

然后稍后检索路径字符串并使用Uri.parse(path)重构Uri

之后,像现在一样使用DocumentFile


请查看getPersistableUriPermissions()。如果您只使用一个uri,则不必保存,但可以使用此函数。

takePersistableUriPermission()
应为您提供持久/永久权限。如果您仅在inActivityResult中调用writeFile(),则您甚至不必使用它们。您最好从意图中删除所有addFlags()。它们既无用又令人困惑。多重选择有效吗?否则,出于同样的原因将其删除。
grantUriPermission()
。同时移除。混乱,这很好用。我获得值为
content://com.android.externalstorage.documents/tree/B9BE-18A6%3ADownload
并可以使用
writeFile(pickedDir,“testfilewhatever.txt”)创建文件如何在“下载”文件夹中添加名为“test”的新文件夹以在那里创建文件<代码>字符串str_pref=prefs.getString(“treeUri”,“defaultValue”)+“/test”不起作用。它仍然会在“下载”文件夹中创建文件。您的问题已得到回答。如果你还有其他问题,那么写一篇新文章。
@Override
public void onActivityResult(int requestCode, int resultCode, Intent resultData){

    if(resultCode!=RESULT_OK)
        return;
    Uri treeUri=resultData.getData();
    pickedDir= DocumentFile.fromTreeUri(getContext(), treeUri);
    getContext().grantUriPermission(getContext().getPackageName(), treeUri, Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
    getContext().getContentResolver().takePersistableUriPermission(treeUri, Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION );

    writeFile(pickedDir, "testfile.txt");

}

public void writeFile(DocumentFile pickedDir, String filename) {
    try {
        DocumentFile file = pickedDir.createFile("text/plain", filename);
        OutputStream out = getContext().getContentResolver().openOutputStream(file.getUri());
        try {
            // write the file content
        } finally {
            out.close();
        }

    } catch (IOException e) {
        throw new RuntimeException("Something went wrong : " + e.getMessage(), e);
    }
}
  Uri treeUri=resultData.getData();