无法使用Android中的ExifInterface设置Date Taken/DateTime标记

Joh*_*nry 6 format datetime android exif

我已经研究并尝试了许多选项来尝试让它发挥作用,但不幸的是,我没有得到任何结果.

我想要做的是在Android应用程序中的JPEG的Exif数据中设置Date Taken标签(Tag_DateTime).我已经有了工作代码来设置Latitude和Longitute标签,但是在我的生活中不能得到Date taken标签来设置.

这是代码:

SimpleDateFormat fmt_Exif = new SimpleDateFormat("yyyy:MM:dd HH:mm:ss");
try {
    ExifInterface exif = new ExifInterface(filePhoto.getPath());

    // Set and save the GPS and time data
    exif.setAttribute(ExifInterface.TAG_GPS_LATITUDE, strLat);
    exif.setAttribute(ExifInterface.TAG_GPS_LONGITUDE, strLong);
    exif.setAttribute(ExifInterface.TAG_DATETIME, fmt_Exif.format(locLatestLocation.getTime()));
    exif.saveAttributes();

} catch (IOException e) {
    e.printStackTrace();
}
Run Code Online (Sandbox Code Playgroud)
  • locLatestLocation - 用于获取时间的位置(以毫秒为单位).
  • fmt_Exif - SimpleDateFormat用于将毫秒时间格式化为TAG_DateTime Exif标记的正确格式.
  • strLat&strLong - 以正确的格式填充其他位置以设置纬度和经度标记.

我在某个帖子中读到标签需要以毫秒格式编写,所以试过这个也无济于事.为了使用实际存储的内容确认我的格式,我从具有Date Taken标记的jpeg文件中读取并输出了未格式化的标记,但输出的格式与我写入标记的格式完全相同不工作

值得一提的是,我已经调查了Sanselan类,并且由于复杂性和缺乏示例,我宁愿尝试让现有的解决方案工作,然后再改为完全不同的解决方案.

有没有人设法做到这一点,如果是这样,我做错了什么?

Phy*_*iux 7

令人讨厌的是,Android 的 ExifInterface 会默默地丢弃它认为无效的任何数据。更糟糕的是,文档甚至没有提到什么是有效值。

我还发现,如果您指定了一个 Android 无法弄清楚的 EXIF 属性(即:它不是 ExifInterface 的 TAG_ 常量之一),它也会完全忽略它,并且也会默默地失败。


Geo*_*nza 6

我刚才需要做同样的事情.我从麻省理工学院读过这篇EXIF文章,我得TAG_DATETIME写完:

exif.setAttribute(ExifInterface.TAG_DATETIME,"2013:06:21 00:00:07");
exif.setAttribute(ExifInterface.TAG_GPS_DATESTAMP,"2013:06:21");
exif.setAttribute(ExifInterface.TAG_GPS_TIMESTAMP,"00:00:07");
Run Code Online (Sandbox Code Playgroud)

看起来像这样预览:

exif 1

exif 2

请注意,这仅在EXIF/TIFF和GPS部分中,而不是实际的原始和数字化时间戳:

exif 3

我也想更改Original和Digitized时间戳,所以尝试了JHeader库:

try {
                    JpegHeaders headers = new JpegHeaders(FakeBurst.PICTURE_PATH);
                    App1Header app1Header = headers.getApp1Header();
                    app1Header.setValue(new TagValue(Tag.IMAGEDESCRIPTION,"bla bla bla"));
                    app1Header.setValue(new TagValue(Tag.DATETIMEORIGINAL,"2013:06:21 00:00:07"));
                    app1Header.setValue(new TagValue(Tag.DATETIMEDIGITIZED,"2013:06:21 00:00:07"));
                    headers.save(true);
                    System.out.println(this+" wrote exif timestamp");
                } catch (Exception e) {
                    e.printStackTrace();
                }
Run Code Online (Sandbox Code Playgroud)

加上这个onCreate:

JpegHeaders.preheat();
Run Code Online (Sandbox Code Playgroud)

它工作:

exif 4

exif 5

我看到这篇文章是从12月开始的,所以我上面发布的Android ExifInterface代码可能不适用于该版本的SDK,但我猜JHeader库方法可行.