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

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

衡玄裳
2023-03-14

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

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

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

我知道我可以更新纵隔的TITLE和DISPLAY_NAME字段,但这不会改变文件名,如果用户决定将文件移到设备之外,那么这个文件仍将使用旧的文件名。

共有1个答案

能业
2023-03-14

更新

嗨,首先为我之前的业余回答道歉。但是,我想不出有什么直接的方法来完成这个要求。然而,我认为可能有一个变通办法,总比什么也没有强。

我们可以仅用Uri重命名文件的唯一方法是通过SAF通过DocumentsContract。我们现在掌握的是纵隔Uri,我们需要获得该文件的等价文档Uri。为此,我们可以使用mediastore.getDocumentURI(context,mediaUri)。问题是,在通过调用这个方法获取文档Uri之前,我们需要拥有它的权限。我们可以为挂载的存储卷(或单独的任何特定目录,其中包含我们要修改的媒体文件)的DocumentTree Uri获得一个可持久化Uri权限。这样,我们就拥有了媒体文件的文档Uri的权限,并且可以使用documentscontract.renamedocument重命名该文件。

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

>

  • 在清单中声明android.permission.read_media_images权限。
  • 向用户请求READ_MEDIA_IMAGES权限。
  • 请求具有媒体文件的存储卷的DocumentTree的Uri权限。

        StorageManager manager = getSystemService(StorageManager.class);
    
        StorageVolume primaryStorageVolume = manager.getPrimaryStorageVolume();
    
        startActivityForResult(primaryStorageVolume.createOpenDocumentTreeIntent(), STORAGE_PERMISSION_REQ_CODE);
    

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

        if (resultCode == RESULT_OK) {
            getContentResolver().takePersistableUriPermission(uri, Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
        }
    
    Uri docUri = MediaStore.getDocumentUri( context , mediaUri );
    DocumentsContract.renameDocument(contentResolver, docUri, "newFileName.ext");
    

    上一答案

    我想我们可以利用这些文件。但为此,您应该使用intent.action_open_document而不是intent.get_content请求文件。获得URI后,可以使用documentscontract.renamedocument重命名该文件

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

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

  •  类似资料:
    • 我从用户的相册中获取了一张图像,并将其保存在一个文件夹中。 以下是代码: 然后我读了图像,用代码改变了它的名字: 但当我尝试用新名称重新加载图像时,我得到一个文件未找到异常,这是代码: 这就是日志错误: 08-09 20:23:50.730 15052-15052/? W/System.err:java.io.FileNotFound异常:lol1.png: open失败: ENOENT(没有这样

    • 我刚刚开始android开发,对于如何将媒体文件保存到外部存储的自定义文件夹非常困惑。我读过关于内窥镜存储,纵隔,但我还是不明白。 我正在尝试将文件保存到外部存储中自己的文件夹中(就像外部存储中的Whatsapp文件夹一样)。我希望结构是这样的: 我不希望媒体文件存储在默认媒体目录(如Pictures/或DCIM/)中。我有些问题: 要用哪一个?作用域存储或纵隔API? 如何实现上述操作? 其他信

    • 问题内容: 如何删除Java中文件的内容? 问题答案: 这个怎么样:

    • 我正在尝试获取uri和后解析为纵隔图像的路径。我这样做是为了获取URI: 在使用此函数之后,我转换路径中的uri: 但结果是,我有媒体存储的路径,但有第一个元素。例如:。但我只想要。 请不要告诉我使用连接和拆分,因为这不是我想要的。

    • 这是我的密码 我必须像这样给视图模型 如何将这个uri转换成文件..??我真的不知道