Android 媒体库datetaken为空,导致照片归类到1970年

293 阅读1分钟

背景

最近用户反馈一个问题,他的照片归类到1970年了,很明显年份不对,第一反应时间戳为0了。时间戳是通过媒体库的DATE_TAKEN获取的,这个字段为什么获取不对呢?

image.png 确实有些照片的DATE_TAKEN为空

DATE_TAKEN是什么?

image.png

DATE_TAKEN可以从EXIF信息或Metadata中提取。
网上看到一种方案是使用DATE_ADDED代替

image.png

DATE_ADDED 行不行?

我理解是不行,因为我本地就有四张照片,通过他们的文件名可以轻松的判断是同一天拍摄的,他们的DATE_ADDED和文件名的日期差了两天
其次,DATE_ADDED类似于文件的创建时间,如果一张照片从云盘下载下来,这个DATE_ADDED应该是当前时间,这样云盘的照片就损失了日期信息

看看竞品怎么处理的?

使用Google Photos在DATE_TAKEN为空的情况下仍然正确解析到正确的日期。那么他是通过Exif信息中获取的么?

对Google Photos清空数据,使用frida hook
image.png

image.png

然后jadx打开通过adb pull提取的apk,查看调用栈

image.png

可以看到这个日期来自于Exif信息

结论

可以确定的是Google photos读取了Exif信息,大概率是使用Exif信息DateTimeOriginal来修复DATE_TAKEN,但不能确认有没有使用MediaMetadataRetriever获取信息来修复。
另外,我测试了一下MediaMetadataRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DATE)对图片获取不到值,ExifInterface.getAttribute(ExifInterface.TAG_DATETIME_ORIGINAL)针对视频获取不到值,不知道是不是图片必须ExifInterface,视频必须MediaMetadataRetriever才能获取到值,还是我的这些图片视频恰好没有写入这些信息,标准的图片视频是有这些信息的。