You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Android:如何向MediaStore插入带旧日期的媒体并让相册正确显示其日期

解决MediaStore插入媒体文件后相册显示日期错误的问题

首先,你的核心问题出在时间戳单位不匹配,还有部分时间字段的数值设置有误,导致相册无法正确识别你想要设置的旧日期。

关键问题拆解

  • MediaStore.MediaColumns.DATE_TAKEN 要求传入的是毫秒级时间戳,但你写的1542628983是秒级时间戳(对应2018-11-19)。系统会把这个数值当成毫秒解析,结果对应的是1970年早期的无效日期,相册找不到有效时间就会 fallback 显示“今天”。
  • DATE_ADDEDDATE_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

火山引擎 最新活动