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

时间:2012-01-25 14:38:34

标签: android datetime format exif

我已经研究并尝试了许多选项来尝试让它发挥作用,但遗憾的是,我没有随处可见。

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

以下是代码:

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();
}
  • locLatestLocation - 用于获取时间的位置(以毫秒为单位)。
  • fmt_Exif - 用于将毫秒时间格式化为TAG_DateTime Exif标记的正确格式的SimpleDateFormat。
  • strLat& strLong - 以正确的格式填充其他地方以设置纬度和经度标记。

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

值得一提的是,我已经考虑过Sanselan课程来做这件事,并且由于复杂性和缺乏示例,我宁愿尝试让现有的解决方案工作,然后再改为完全不同的解决方案。

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

6 个答案:

答案 0 :(得分:6)

我刚才需要做同样的事情。 我已经阅读了这个EXIF article from MIT,我写了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");

看起来像这样预览:

exif 1

exif 2

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

exif 3

我也想更改原始时间戳和数字时间戳,所以尝试了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();
                }

将此添加到onCreate

JpegHeaders.preheat();

它起作用了:

exif 4

exif 5

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

答案 1 :(得分:4)

Android的ExifInterface,恼人地,无声地丢弃它认为无效的任何数据。更糟糕的是,文档甚至没有提到有效值可能是什么。

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

答案 2 :(得分:2)

我和你有同样的问题。当我尝试使用TAG_DATETIME保存拍摄日期时,它不起作用,并且原始的taken_date已丢失。我真的不知道getDateTime()和getGpsDateTime()的@hide函数之间的区别。似乎getGpsDateTime()是截取日期。我会尝试TAG_GPS_DATESTAMP和TAG_GPS_TIMESTAMP。

/**
 * Returns number of milliseconds since Jan. 1, 1970, midnight UTC.
 * Returns -1 if the date time information if not available.
 * @hide
 */
public long getGpsDateTime() {
    String date = mAttributes.get(TAG_GPS_DATESTAMP);
    String time = mAttributes.get(TAG_GPS_TIMESTAMP);
    if (date == null || time == null) return -1;

    String dateTimeString = date + ' ' + time;
    if (dateTimeString == null) return -1;

    ParsePosition pos = new ParsePosition(0);
    try {
        Date datetime = sFormatter.parse(dateTimeString, pos);
        if (datetime == null) return -1;
        return datetime.getTime();
    } catch (IllegalArgumentException ex) {
        return -1;
    }
}

答案 3 :(得分:1)

您可以像在ExifInterface.java中一样尝试

private static SimpleDateFormat sFormatter;

    static {
        sFormatter = new SimpleDateFormat("yyyy:MM:dd HH:mm:ss");
        sFormatter.setTimeZone(TimeZone.getTimeZone("UTC"));
    }

然后更新:

exif.setAttribute(ExifInterface.TAG_DATETIME,
                            sFormatter.format(new Date(System.currentTimeMillis())));

答案 4 :(得分:0)

SimpleDateFormat dateTimeFormat = new SimpleDateFormat("yyyy:MM:dd HH:mm:ss");

exifInterface.setAttribute("DateTimeOriginal", dateTimeFormat.format(date));
exifInterface.setAttribute("DateTimeDigitized", dateTimeFormat.format(date));

这对我有用(至少API等级14 +)

答案 5 :(得分:-1)

我遇到了一个问题,即来自Nexus 6和Lumia 935的图片没有 CreateDate DateTimeOriginal 字段。

Android和Windows手机也将时间戳保存在文件名 IMG_20160320_145825.jpg WP_20160328_13_40_42_Pro.jpg

我成功解决了这个问题并添加了运行此脚本的字段:

#! /bin/bash

COUNTER=0
for filename in ./*
do
    case "$filename" in
        *.JPG|*.jpeg|*.jpg)
            COUNTER=$[$COUNTER +1]
            y=${filename:6:4}
            M=${filename:10:2}
            d=${filename:12:2}
            H=${filename:15:2}
            m=${filename:17:2}
            s=${filename:19:2}
            echo "'"$y":"$M":"$d $H":"$m":"$s"'" " --> "$filename
            exiftool -v2 -AllDates="'"$y":"$M":"$d" "$H":"$m":"$s"'" -overwrite_original $filename
            ;;
        *)
            echo $filename 'Not a *.jpg'
            ;;
    esac
done

echo $COUNTER "files updated"

我希望它可以帮助某人