【问题标题】:Android: How to get permanent write permission on removable sd-card?Android:如何获得可移动 sd 卡的永久写入权限?
【发布时间】:2017-04-19 08:11:55
【问题描述】:

我最近几天浏览了存储访问框架,但仍然不明白。

我的问题是:如何在选择 sd 卡位置后,在没有提示选择路径的情况下在 sd 卡上创建具有这些权限的文件?

我可以在我的 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);
    }
}

【问题讨论】:

  • takePersistableUriPermission() 应该给你持久/永久的权限。
  • 如果你只在 inActivityResult 中调用 writeFile() ,你甚至不必使用它们。
  • 您最好从您的意图中删除所有 addFlags() 。它们无用且令人困惑。多重有效吗?否则出于同样的原因将其删除。
  • grantUriPermission()。同时删除。令人困惑。

标签: android android-permissions android-sdcard documentfile


【解决方案1】:
  Uri treeUri=resultData.getData();

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

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

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

之后像现在一样使用 DocumentFile。

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

【讨论】:

  • 这很好用。我得到了值为content://com.android.externalstorage.documents/tree/B9BE-18A6%3ADownload 的sharedPrefs 并且可以使用writeFile(pickedDir, "testfilewhatever.txt"); 创建一个文件 如何在“Download”文件夹中添加一个名为“test”的新文件夹以在那里创建一个文件? String str_pref = prefs.getString("treeUri", "defaultValue") + "/test"; 不起作用。它仍然在“下载”文件夹中创建文件
  • 您的问题已得到解答。如果您还有其他问题,请发新帖。
猜你喜欢
  • 2012-05-27
  • 1970-01-01
  • 1970-01-01
  • 2011-01-08
  • 1970-01-01
  • 2017-08-20
  • 2017-12-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多