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

时间:2017-04-19 08:11:56

标签: android android-permissions android-sdcard documentfile

我在最后几天经历了存储访问框架,仍然没有得到它。

我的问题是:如何在SD卡上创建一个具有这些权限的文件,而不会在选择SD卡位置后选择一个patha?

我可以在我的SD卡上选择一个路径,用以下代码创建一个文件。 (有效)

        Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE);
        intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true);
        intent.putExtra(Intent.EXTRA_LOCAL_ONLY, true);
        intent.addFlags(Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION);
        intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
        intent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
        startActivityForResult(intent, 42);

在onActivityResult中我做了

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

1 个答案:

答案 0 :(得分:3)

  Uri treeUri=resultData.getData();

保存treeUri以供进一步使用。供以后使用。

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

然后检索路径字符串并重建Uri wit Uri.parse(path);

之后使用DocumentFile,就像现在一样。

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