Per*_*abs 8 android uri rename file mediastore
在Android Q中,MediaStore.Files.FileColumns.DATA字段已弃用,可能为null或应用可能无权读取它,因此可以使用以下方法重命名文件的文件名部分(而不是路径)仅其媒体内容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将是一次性的事情(直到手动撤销)
android.permission.READ_MEDIA_IMAGES。向包含媒体文件的存储卷的 DocumentTree 请求 Uri 权限。
    StorageManager manager = getSystemService(StorageManager.class);
    StorageVolume primaryStorageVolume = manager.getPrimaryStorageVolume();
    startActivityForResult(primaryStorageVolume.createOpenDocumentTreeIntent(), STORAGE_PERMISSION_REQ_CODE);
但是,请注意,根据 Android 的文档,用户可以选择除我们请求的位置之外的位置。
onActivityResult 获取结果 Uri 的持久化权限
    if (resultCode == RESULT_OK) {
        getContentResolver().takePersistableUriPermission(uri, Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
    }
现在获取媒体文件的 Documents Uri 并重命名。
Uri docUri = MediaStore.getDocumentUri( context , mediaUri );
DocumentsContract.renameDocument(contentResolver, docUri, "newFileName.ext");
因此基本上我们必须请求用户许可两次,一次用于存储访问,第二次用于 Uri 访问。由于我们将获得持久的 Uri 权限,因此此提示将是一次性的,并且会一直持续到我们撤销它为止。我们可以使用文档 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您可以通过检查结果意图中是否设置了该标志来验证这一点。