You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何重命名从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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 23:36:04