Android:如何向MediaStore插入带旧日期的媒体并让相册正确显示其日期
解决MediaStore插入媒体文件后相册显示日期错误的问题
首先,你的核心问题出在时间戳单位不匹配,还有部分时间字段的数值设置有误,导致相册无法正确识别你想要设置的旧日期。
关键问题拆解
MediaStore.MediaColumns.DATE_TAKEN要求传入的是毫秒级时间戳,但你写的1542628983是秒级时间戳(对应2018-11-19)。系统会把这个数值当成毫秒解析,结果对应的是1970年早期的无效日期,相册找不到有效时间就会 fallback 显示“今天”。DATE_ADDED和DATE_MODIFIED的数值1542628明显不合理——这个秒数只对应1970年1月18日左右,和你想要的2018年日期完全不符,应该设置为和目标日期一致的秒级时间戳。
修正后的代码示例
// 先定义目标日期对应的秒级时间戳(2018-11-19) val targetDateSeconds = 1542628983L val values = ContentValues() val extension = fileName.fileExtension() val mimeType = MimeTypeMap.getSingleton().getMimeTypeFromExtension(extension) values.apply { put(MediaStore.MediaColumns.DISPLAY_NAME, fileName) put(MediaStore.MediaColumns.MIME_TYPE, mimeType) // DATE_ADDED 和 DATE_MODIFIED 使用秒级时间戳 put(MediaStore.MediaColumns.DATE_ADDED, targetDateSeconds) put(MediaStore.MediaColumns.DATE_MODIFIED, targetDateSeconds) // DATE_TAKEN 必须转成毫秒级时间戳,所以乘以1000 put(MediaStore.MediaColumns.DATE_TAKEN, targetDateSeconds * 1000) if (AndroidUtils.isAtLeastQ()) { put(MediaStore.MediaColumns.RELATIVE_PATH, getRelativePath(fileType)) } } val url = resolver.insert(getMediaCollection(fileType, ExternalPrimary), values)
额外注意点
- 建议用
Calendar或者java.time这类API生成目标日期的时间戳,避免手动输入出错。比如要生成2018-11-19的时间戳,可以这样写:val targetDate = LocalDate.of(2018, 11, 19).atStartOfDay(ZoneId.systemDefault()) val targetDateSeconds = targetDate.toEpochSecond() - 如果是插入真实的媒体文件(不是空文件),部分第三方相册可能会优先读取文件本身的元数据(比如图片的Exif信息、视频的内置时间标签),建议同时修改文件的元数据,和MediaStore里的字段保持一致,这样所有相册都能正确识别日期。
内容的提问来源于stack exchange,提问作者ahmetvefa53




