如何重命名从Android MediaStore获取的视频且不删除或损坏原文件
现有代码问题
- 重命名文件成功后调用
resolver.delete()删除了MediaStore中对应文件的索引记录,导致系统媒体库无法检索到该视频,表现为视频“被删除/损坏”,实际存储路径中文件仍然存在 - 直接使用
File.renameTo()操作公共媒体目录文件,在Android 10(API 29)及以上版本受分区存储限制会失效 MediaStore.MediaColumns.DATA字段在API 29及以上已废弃,基于该字段的操作不具备可靠性
正确实现方式
不要手动操作文件重命名+修改媒体库索引,直接通过ContentResolver.update()通知系统修改媒体属性,系统会自动完成文件重命名+索引同步,不会损坏原文件。
// 校验输入标题合法性 String title = editTextTitle.getText().toString().trim(); if (title.isEmpty()) { Toast.makeText(context, "标题不能为空", Toast.LENGTH_SHORT).show(); return; } // 提取原文件扩展名,非法扩展名兜底处理 String extension = videoFile.getAbsolutePath(); extension = extension.substring(extension.lastIndexOf(".")); if (extension.isEmpty()) { extension = ".mp4"; } String newDisplayName = title + extension; ContentResolver resolver = context.getContentResolver(); // 替换为你从MediaStore查询该视频时获取的_id字段值 long videoId = 你查询到的该视频的ID; Uri videoUri = ContentUris.withAppendedId(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, videoId); ContentValues values = new ContentValues(); values.put(MediaStore.Video.Media.DISPLAY_NAME, newDisplayName); // 适配Android 10及以上版本 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { // 如果需要修改存放目录可以新增RELATIVE_PATH配置,不需要则省略 // values.put(MediaStore.Video.Media.RELATIVE_PATH, Environment.DIRECTORY_MOVIES + "/自定义目录"); values.put(MediaStore.Video.Media.IS_PENDING, 1); } // 执行更新操作 int updateCount = resolver.update(videoUri, values, null, null); if (updateCount > 0) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { values.clear(); values.put(MediaStore.Video.Media.IS_PENDING, 0); resolver.update(videoUri, values, null, null); } // 更新自定义实体类的标题属性 video.setTitle(title); Toast.makeText(context, "重命名成功", Toast.LENGTH_SHORT).show(); } else { Toast.makeText(context, "重命名失败", Toast.LENGTH_SHORT).show(); }
注意事项
- 提前在MediaStore查询视频时获取
_id字段构造目标Uri,不要依赖废弃的DATA字段拼接路径 - 申请对应存储权限:API < 33 申请
WRITE_EXTERNAL_STORAGE,API >=33 申请READ_MEDIA_VIDEO权限,无权限会导致更新失败 - 针对特殊系统(如部分国产定制ROM)如果更新失败,可以在更新完成后主动触发媒体扫描,同步最新文件信息
内容的提问来源于stack exchange,提问作者ahmadu suleiman
相关产品推荐
相关产品推荐

