Не могу установить тег Date Taken / DateTime с помощью ExifInterface в Android - PullRequest
6 голосов
/ 25 января 2012

Я исследовал и попробовал множество вариантов, чтобы попытаться заставить это работать, но, к сожалению, никуда не денусь.

Я пытаюсь установить тег Date Taken (Tag_DateTime) в данных Exif JPEG из приложения Android. У меня уже есть рабочий код для установки тегов Latitude и Longitute, но я не могу на всю жизнь заставить установить тег 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 - SimpleDateFormat, используемый для форматирования миллисекундного времени в правильный формат для тега TAG_DateTime Exif.
  • strLat & strLong - заполняется в другом месте в правильном формате для установки тегов широты и долготы.

Я где-то читал в посте, что тег должен быть записан в формате миллисекунд, поэтому попробовал это тоже безрезультатно. Чтобы подтвердить мое форматирование тем, что на самом деле хранится, я прочитал и вывел неформатированный тег из файла jpeg, который имеет тег Date Taken, но вывод в том же формате, что и то, что я пишу в тег, и его не работает.

Возможно, стоит упомянуть, что я искал класс Sanselan, чтобы сделать это, и из-за сложности и отсутствия примеров, скорее всего, попытался бы заставить мое существующее решение работать, прежде чем перейти к совершенно другому.

Кому-нибудь удалось это сделать, и если да, что я делаю не так?

Ответы [ 6 ]

6 голосов
/ 22 июня 2013

Мне нужно то же самое только сейчас. Я прочитал эту EXIF ​​статью из 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

Я вижу, что это сообщение за декабрь, поэтому, возможно, код Android ExifInterface, который я разместил выше, не работал с этой версией SDK, но я предполагаю, что подход библиотеки JHeader будет работать.

4 голосов
/ 21 февраля 2012

ExifInterface Android, к сожалению, молча отбрасывает любые данные, которые он считает недействительными. Что еще хуже, в документации даже не упоминаются допустимые значения.

Я также обнаружил, что если вы укажете атрибут EXIF, который Android не может выяснить (т. Е. Это не одна из констант TAG_ в ExifInterface), он также полностью его проигнорирует и также потерпит неудачу.

2 голосов
/ 19 октября 2012

У меня такая же проблема с тобой.Когда я пытаюсь использовать TAG_DATETIME для сохранения взятой даты, она не работает, и первоначальная взятая дата была потеряна.Я действительно не знаю разницу между функцией @hide в getDateTime () и getGpsDateTime ().Похоже, 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;
    }
}
1 голос
/ 11 сентября 2014

Вы можете попробовать, как они это делали в 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())));
0 голосов
/ 29 марта 2016

Я столкнулся с проблемой, что изображения из Nexus 6 и Lumia 935 не имеют полей CreateDate и DateTimeOriginal .

Android и Windows Phone сохраняют временную метку также наимя_файла 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"

Надеюсь, это кому-нибудь поможет

0 голосов
/ 20 апреля 2015
SimpleDateFormat dateTimeFormat = new SimpleDateFormat("yyyy:MM:dd HH:mm:ss");

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

Это работает для меня (по крайней мере, уровень API 14 +)

...