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

问题描述 投票:8回答:1

在Android Q中,MediaStore.Files.FileColumns.DATA字段一直是deprecated,可能为null或者应用程序可能没有权限读取它,因此有没有办法重命名文件的文件名部分(而不是路径)只有它的媒体内容Uri?

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

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

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

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

android file uri rename mediastore
1个回答
2
投票

更新

嗨,首先为我以前的业余答案道歉。但是,我想不出任何直接的方法来完成这个要求。但是,我认为可能有一种解决方法,总比没有好。

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

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

  1. 在Manifest中声明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");

所以基本上我们必须两次询问用户权限,一次是存储访问,另一次是Uri访问。由于我们将获得持久的Uri许可,因此这个提示将是一次性的事情,它会持续到我们撤销它。我们可以使用它的Document Uri访问所有文件而无需用户选择它。


上一个答案

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.