当前位置: 首页 > 知识库问答 >
问题:

获取正确Uri路径的存储访问框架删除/编辑/获取文件

南宫凯康
2023-03-14

让我分享到目前为止我所学到的,并提出我的问题。如果希望获取文件夹的Uri并对其进行操作,则应使用intentaction_open_document_tree获取访问文件夹的Uri,并为该Uri设置W/R权限。

授予onActivityResult的持久权限:

final int takeFlags = data.getFlags() & (Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
// Check for the freshest data.
getContentResolver().takePersistableUriPermission(treeUri, takeFlags);

如果选择设备的主文件夹:

Uri treeUri = data.getData();
treeUri.toString()
File mediaStorageDir = new File(Environment.getExternalStorageDirectory(), "");
new File(treeUri.toString()).getAbsolutePath();

如果使用DocumentFile类获取主文件夹的路径

DocumentFile saveDir = null;
saveDir = DocumentFile.fromFile(Environment.getExternalStorageDirectory());
String uriString = saveDir.getUri().toString();

返回:file:///storage/emulated/0

我的第一个问题是如何使用DocumentFile类获得包含内容的Uri。

 @TargetApi(19)
protected DocumentFile getSaveDirMainMemory() {
    DocumentFile saveDir = null;
    saveDir = DocumentFile.fromFile(Environment.getExternalStorageDirectory());
    // saveDir =
    // DocumentFile.fromFile(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM));
    // saveDir =
    // DocumentFile.fromFile(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES));

    DocumentFile newDir = null;
    /*
     * Check or create Main Folder
     */

    // Check if main folder exist
    newDir = saveDir.findFile(DIR_MAIN);

    // Folder does not exist, create it
    if (newDir == null || !newDir.exists()) {
        newDir = saveDir.createDirectory(DIR_MAIN);
    }
    /*
     * Check or create Sub-Folder
     */
    DocumentFile newSubDir = null;

    // Check if sub-folder exist
    newSubDir = newDir.findFile(DIR_SUB);


    // Folder does not exist, create it
    if (newSubDir == null || !newSubDir.exists()) {
        newSubDir = newDir.createDirectory(DIR_SUB);
    }

    if (newSubDir != null && newSubDir.exists()) {
        return newSubDir;
    } else if (newDir != null && newDir.exists()) {
        return newDir;
    } else {
        return saveDir;
    }
}
DocumentFile imageToDeletePath = DocumentFile.fromFile(new File(lastSavedImagePath));
DocumentFile imageToDelete = imageToDeletePath.findFile(lastSavedImageName);
@TargetApi(19)
protected DocumentFile getSaveDirNew(String uriString) {
    DocumentFile saveDir = null;

    boolean canWrite = isUriWritePermission(uriString);

    if (canWrite) {
        try {
            saveDir = DocumentFile.fromTreeUri(MainActivity.this, Uri.parse(uriString));
        } catch (Exception e) {
            saveDir = null;
        }
    }

    return saveDir;
}

检查字符串中的Uri是否具有写权限,如果不获取或移除可持久化的权限,则Uri可能没有写权限。

private boolean isUriWritePermission(String uriString) {
    boolean canWrite = false;

    List<UriPermission> perms = getContentResolver().getPersistedUriPermissions();
    for (UriPermission p : perms) {
        if (p.getUri().toString().equals(uriString) && p.isWritePermission()) {
            Toast.makeText(this, "canWrite() can write URI::  " + p.getUri().toString(), Toast.LENGTH_LONG).show();
            canWrite = true;
            break;
        }
    }
    return canWrite;
}

使用有效uri保存图像并使用

DocumentFile imageToDeletePath = DocumentFile.fromTreeUri(this, Uri.parse(lastSavedImagePath));
DocumentFile imageToDelete = imageToDeletePath.findFile(lastSavedImageName);

共有1个答案

史钊
2023-03-14

uri.fromfile()documentfile.fromtreeuri()从两个不同的世界创建URI。

虽然它们目前看起来非常相似,但这只是巧合,可能会随着未来任何Android版本的发布而改变。

没有“非黑客”的方式从一个转换到另一个。如果您想要一个肮脏的解决方案,可以进行反射(查看documentfile.fromtreeuri的源代码,并可能在较新的Android版本上使用storage类。

 类似资料:
  • 在Android4.4(KitKat)的新图库访问之前,我通过以下方法在SD卡上获得了我的真实路径: 现在,intent.action_get_content返回不同的数据: 我怎样才能获得SD卡上的真实路径?

  • (编辑)由@blackapps回答:将“w”改为“wt”。而且奏效了! //-----------------------------------// 我已经尝试使用直接路径,它工作正确。我认为原因是它创建了一个新的文件来替换原来的文件。然而,我只是不想使用直接路径。 我已经尝试了PrintWriter清除内容,但它也需要直接路径创建文件,然后放入PrintWriter。 我已经尝试过使用Outp

  • 问题内容: 我的Android应用程序想要在Google云端硬盘中创建一个文件夹,并从设备上的云端硬盘应用程序获取uri。 它发送一个意图,您可以看到以下代码: 然后获取返回的数据,您可以看到以下代码: 我使用了在互联网上发现的一种模仿类型,它似乎是一种标准类型。使用“ application / vnd.google- apps.folder”时会发出相同的错误。目标是要有一个文档树,但是在lo

  • 我想从URI中获得完整的文件路径。URI不是图像,而是音乐文件,但如果我像纵隔解决方案那样做,如果应用程序用户选择eg Astro作为浏览器,而不是音乐播放器,它就不会工作。我怎么解决这个?

  • 我尝试了堆栈溢出的大部分答案,它们给出了我的.java文件不存在的路径。如何获取我的文件实际存在或存在的路径? 假设我的java文件名为,其位置为。所以我想打印路径。 我将文件部署到某个服务器,然后在那里运行它,无论我想打印路径,我都会得到这样的位置,其中没有文件。

  • 因此,我使用Reformation将图像上传到我们的服务器,并使用gallery chooser选择图像。我试图获取图像的路径,因为uri。getPath()返回未找到的文件作为异常。我几乎看过关于这个主题的每一篇stackoverflow文章,但仍然没有答案。下面的代码与我在网上看到的所有代码都类似,它总是返回null,我不知道为什么。请帮忙