Подтвердить что ты не робот

Android ExifInterface saveAttributes() без перезаписи предыдущих данных?

Я пытаюсь записать lat-long и другие данные в заголовок Exif jpeg в моем приложении для камеры. Обычно андроид автоматически заполняет заголовок данными, такими как диафрагма, ISO, скорость затвора и т.д. Однако, когда я добавляю вручную, создайте экземпляр ExifInterface, установите местоположение GPS с помощью SetAttributes() и вызовите SaveAttributes(); все другие данные камеры исчезают.

Предполагается ли это? Как я могу просто добавить тег, не перезаписывая все остальное?

Я видел пример в другом месте создания двух ExifInterfaces, старого (из рисунка) и нового и копирования каждого заполненного значения из старого в новое вместе с любыми другими данными. Это, однако, раздражает и длительно. Я хотел бы найти лучшее решение.

Вот мой код:

try{ 
    ExifInterface exif = new ExifInterface(pictureFile.getAbsolutePath());
    exif.setAttribute(ExifInterface.TAG_GPS_LATITUDE, mGpsLocation.getLatDms());
    exif.setAttribute(ExifInterface.TAG_GPS_LONGITUDE, mGpsLocation.getLonDms());
    exif.setAttribute(ExifInterface.TAG_GPS_ALTITUDE, mGpsLocation.getAltDms());
    exif.saveAttributes(); 
} catch(IOException e){
    e.printStackTrace(); 
}

Спасибо

4b9b3361

Ответ 1

Из документации, которую я видел, это не должно произойти. http://developer.android.com/reference/android/media/ExifInterface.html

public void saveAttributes ()

Added in API level 5
Save the tag data into the JPEG file. This is expensive because it involves copying all the JPG data from one file to another and deleting the old file and renaming the other. It best to use setAttribute(String, String) to set all attributes to write and make a single call rather than multiple calls for each attribute.

Throws
IOException 

В нем четко сказано, что он копирует ВСЕ данные, включая то, что вы говорите, исчезает. Не могли бы вы опубликовать то, что вы тестируете. Если вы находитесь на Android Studio, вы можете попробовать "Файл" → "Недействительный кеш/перезапуск" → "Недействить и перезагрузить".

В качестве альтернативы я нашел ответ на аналогичный вопрос о потере данных здесь: fooobar.com/info/22405/...

Как указывали другие, вы должны скопировать данные EXIF ​​из оригинальное изображение до окончательного размера изображения. Sanselan Android библиотека, как правило, лучше всего подходит для этого. В зависимости от версии ОС Android, ExifInterface иногда искажает данные EXIF. В дополнение ExifInterface также обрабатывает ограниченное количество тегов Exif, а именно только те теги, о которых он "знает". Санселан, с другой стороны, будет сохраняйте все теги EXIF ​​и отметки маркера.      Вот сообщение в блоге, в котором показано, как использовать Sanselan для копирования данных изображения: http://bricolsoftconsulting.com/copying-exif-metadata-using-sanselan/     BTW, на Android я также склонен поворачивать изображения и удалять тэг Orientation EXIF. Например, на Nexus S с Android 4.03 камера установила тег ориентации в метаданных EXIF, но webview игнорировал эту информацию и отображал изображение неправильно. К сожалению, вращение фактических данных изображения и удаление EXIF Ориентировочный тег - единственный способ получить каждую программу для отображения изображений правильно.

Надеюсь, это поможет.