Android: установите GPSTimeStamp в jpg EXIF-теги

Я пытаюсь установить "GPSTimeStamp" в теги exif jpg через android. Документация довольно скудна на этом:
http://developer.android.com/reference/android/media/ExifInterface.html#TAG_GPS_TIMESTAMP Тип - это строка. Постоянное значение: "GPSTimeStamp". Но какой именно формат?

Глядя здесь: http://www.sno.phy.queensu.ca/~phil/exiftool/TagNames/GPS.html
GPSTimeStamp: rational64u [3] (при записи дата удаляется, если присутствует, и время настраивается на UTC, если оно включает часовой пояс)

Итак, мне нужно длинное значение массива из 3 ячеек? Я не уверен, что добавить. Я получил "UTC время этого исправления в миллисекундах с 1 января 1970 года". через location.gettime().
http://developer.android.com/reference/android/location/Location.html#getTime%28%29
Если я напишу длинное значение в виде строки в меток времени и проверит теги exif через exif в Linux, я получаю сообщение об ошибке "знаменатель". Все эксперименты с hh: mm: ss или другими форматами потерпели неудачу. Здесь немного потеряно.

Ответы

Ответ 1

Правильный формат для атрибута GPSTimeStamp для времени выборки 14:22:32 -

"14/1,22/1,32/1"

Вы можете использовать следующий код:

Location location = ...; // TODO - Set location properly.
long locationTome = location.getTime();
ExifInterface imageExif = new ExifInterface("absolute_path_to_image");
Calendar calendar = Calendar.getInstance();

calendar.setTimeInMillis(locationTome);
int hourOfDay = calendar.get(Calendar.HOUR_OF_DAY);
int minutes = calendar.get(Calendar.MINUTE);
int seconds = calendar.get(Calendar.SECOND);

String exifGPSTimestamp = hourOfDay + "/1," + minutes + "/1," + seconds + "/1";

imageExif.setAttribute("GPSTimeStamp", exifGPSTimestamp);
imageExif.saveAttributes();

Он имеет аналогичный формат: GPSLatitude и GPSLongitude. Полезное объяснение для такого формата можно также найти здесь: http://www.ridgesolutions.ie/index.php/2015/03/05/geotag-exif-gps-latitude-field-format/

Ответ 2

В исходном коде Camera.java от Android метод setGpsTimestamp имеет следующее описание и реализацию:

    /**
     * Sets GPS timestamp. This will be stored in JPEG EXIF header.
     *
     * @param timestamp GPS timestamp (UTC in seconds since January 1,
     *                  1970).
     */
    public void setGpsTimestamp(long timestamp) {
        set(KEY_GPS_TIMESTAMP, Long.toString(timestamp));
    }

Таким образом, время UTC вашего исправления в миллисекундах должно быть преобразовано в секунды, так что это просто вопрос деления на 1000.