我已经研究并尝试了许多选项来尝试让它发挥作用,但遗憾的是,我没有随处可见。
我要做的是在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();
}
我在某个帖子中读到标签需要以毫秒格式编写,所以试过这个也无济于事。 为了使用实际存储的内容确认我的格式,我从具有Date Taken标记的jpeg文件中读取并输出了未格式化的标记,但输出的格式与我写入标记的格式完全相同不工作。
值得一提的是,我已经考虑过Sanselan课程来做这件事,并且由于复杂性和缺乏示例,我宁愿尝试让现有的解决方案工作,然后再改为完全不同的解决方案。
有没有人设法做到这一点,如果是这样,我做错了什么?
答案 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 / TIFF和GPS部分中,而不是实际的原始和数字化时间戳:
我也想更改原始时间戳和数字时间戳,所以尝试了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();
它起作用了:
我看到这篇文章是从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"
我希望它可以帮助某人