gpt4 book ai didi

android - 如何在仅知道其媒体内容 Uri 的 Android 中重命名文件

转载 作者:塔克拉玛干 更新时间:2023-11-02 18:59:04 27 4
gpt4 key购买 nike

Android Q 中,MediaStore.Files.FileColumns.DATA 字段为 deprecated , 并且可能为空或应用程序可能无权读取它,因此有没有办法仅使用其媒体内容 Uri 重命名文件的文件名部分(而不是路径)?

到目前为止,DATA 字段可用于从已知 Uri 中查找文件的真实路径,但由于它已被弃用,因此我们的想法是甚至不要尝试查找或解析真实文件路径,而仅使用其内容 Uri。

考虑到 Uri 将采用标准媒体内容格式(不是 SAF 格式):content://media/external/images/media/123

目的是重命名 Uri 指向的文件的名称。

我知道我可以更新 MediaStore 的 TITLE 和 DISPLAY_NAME 字段,但这不会更改文件名,如果用户决定将文件移出设备,那么这个文件仍将具有旧文件名。

最佳答案

更新

您好,首先对我之前的业余回答表示歉意。但是,我想不出任何直接的方法来完成要求。但是,我认为可能有一个解决方法,总比没有好。

我们可以仅使用 Uri 重命名文件的唯一方法是通过 SAF 通过 DocumentsContract。我们现在掌握的是 MediaStore Uri,我们需要获取该文件的等效文档 Uri。为此,我们可以使用 MediaStore.getDocumentUri( context , mediaUri )。问题是,在获取文档 Uri 之前,我们需要通过调用此方法获得它的权限。我们可以获得挂载存储卷(或任何特定目录,其中包含我们要修改的媒体文件)的 DocumentTree Uri 的持久化 Uri 权限。通过这样做,现在我们将获得媒体文件的 Documents Uri 的权限,我们可以使用 DocumentsContract.renameDocument 重命名该文件。

步骤 1-4 将是一次性的事情(直到手动撤销)

  1. 在 list 中声明 android.permission.READ_MEDIA_IMAGES 权限。
  2. 向用户请求 READ_MEDIA_IMAGES 权限。
  3. 向 Uri 请求具有媒体文件的存储卷的 DocumentTree 权限。

        StorageManager manager = getSystemService(StorageManager.class);

    StorageVolume primaryStorageVolume = manager.getPrimaryStorageVolume();

    startActivityForResult(primaryStorageVolume.createOpenDocumentTreeIntent(), STORAGE_PERMISSION_REQ_CODE);

但是,请注意,根据 Android 的文档,用户可以选择我们要求的位置以外的位置。

  1. onActivityResult 获取结果 Uri 的持久化权限

        if (resultCode == RESULT_OK) {
    getContentResolver().takePersistableUriPermission(uri, Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
    }
  2. 现在获取媒体文件的 Documents Uri 并重命名。

    Uri docUri = MediaStore.getDocumentUri( context , mediaUri );
    DocumentsContract.renameDocument(contentResolver, docUri, "newFileName.ext");

So basically we'll have to ask user permission twice, once for storage access and second for Uri access. Since we'll be getting a persistable Uri permission, this prompt will be a one time thing and it lasts until we revoke it. We can access all the files using it's Document Uri without having the user select it.


上一个答案

我认为我们可以使用 DocumentsContract。但为此,您应该使用 Intent.ACTION_OPEN_DOCUMENT 而不是 Intent.GET_CONTENT 来请求文件。获得 URI 后,您可以使用 DocumentsContract.renameDocument 重命名该文件

DocumentsContract.renameDocument(contentResolver, uri, "newFileName.ext");

但是,提供URI的DocumentProvider应该支持重命名功能。例如,如果我从 Recents 中选择一个文件,则不支持重命名。但是,如果我选择与其他提供程序相同的文件,比如默认文件管理器,将支持重命名操作。您可以通过检查是否在结果 Intent 中设置了标志 DocumentsContract.Document.FLAG_SUPPORTS_RENAME 来验证这一点。

关于android - 如何在仅知道其媒体内容 Uri 的 Android 中重命名文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55314476/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com