Android ExifInterface saveAttributes () Sin sobrescribir datos anteriores?

Estoy tratando de escribir lat-largo y otros datos a la cabecera Exif de un jpeg en mi aplicación de cámara personalizada. Normalmente, android llena automáticamente el encabezado con datos como apertura, ISO, velocidad del obturador, etc. Sin embargo, cuando agrego manualmente crear una instancia de ExifInterface , establecer la ubicación GPS con SetAttributes() y llamar a SaveAttributes() ; Todos los demás datos de la cámara desaparecen.

Se supone que pase esto? ¿Cómo puedo simplemente agregar una etiqueta sin sobrescribir todo lo demás?

Vi un ejemplo en otro lugar de la creación de dos ExifInterfaces, una antigua (de la imagen) y una nueva, y copiando cada valor poblado de la antigua a la nueva, junto con cualquier otro dato. Esto sin embargo, es molesto y largo. Me gustaría encontrar una solución mejor.

Aquí está mi código:

 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(); } 

Gracias

De la documentación que he visto esto esto no se supone que suceda. 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's 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 

Dice claramente que está copiando TODOS los datos, incluyendo las cosas que usted dice está desapareciendo. ¿Podrías publicar lo que estás probando? Si estás en Android Studio puedes intentar Archivo -> Invalidar Caché / Reiniciar -> Invalidar y Reiniciar.

Como alternativa, encontré una respuesta a una pregunta similar sobre la pérdida de los datos aquí: https://stackoverflow.com/a/13784057/3585278

Como otros han indicado, debe copiar los datos EXIF ​​de la imagen original a la imagen redimensionada final. La biblioteca de Sanselan Android suele ser mejor para esto. Dependiendo de la versión del sistema operativo Android, el ExifInterface a veces corrompe los datos EXIF. Además, ExifInterface también maneja un número limitado de etiquetas Exif, es decir, sólo las etiquetas que "conoce". Sanselan por otro lado mantendrá todas las etiquetas EXIF ​​y notas marcador. Aquí hay una entrada en el blog que muestra cómo usar Sanselan para copiar datos de imagen: http://bricolsoftconsulting.com/copying-exif-metadata-using-sanselan/ BTW, en Android También tengo la tendencia a rotar las imágenes y eliminar la Orientación EXIF etiqueta. Por ejemplo, en un Nexus S con Android 4.03, la cámara estaba estableciendo una etiqueta de orientación en los metadatos EXIF, pero la vista web ignoraba esa información y mostraba la imagen incorrectamente. Lamentablemente, la rotación de los datos de imagen reales y la eliminación de la etiqueta de orientación EXIF ​​es la única manera de conseguir que cada programa muestre las imágenes correctamente.

Espero que esto ayude.

  • ¿Qué parte de los dispositivos Android beneficia de las optimizaciones de Libjpeg-turbo?
  • Conversión de mapa de bits en jpeg en android
  • Cómo crear un GIF animado de JPEGs en Android (desarrollo)
  • Dibujar texto en la imagen jpg android
  • El tamaño de la imagen aumenta cuando se convierte de jpg a webp con un valor de calidad 100
  • ¿Cuál es la manera más eficiente de cargar mi archivo JPG almacenado en ImageView?
  • ¿Cómo abrir un archivo JPG como un BITMAP con el JPG almacenado en el SDCARD?
  • Construir OpenJPEG para Android
  • Leer en JPG como RGB888 en Android
  • Al guardar el mapa de bits en el disco, las rutas sólidas muestran los artefactos
  • API de acceso de decodificador JPEG HW
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.