2012-01-25 12 views
5

Investigué e intenté varias opciones para intentar que esto funcionara, pero desafortunadamente no estoy llegando a ningún lado.No se puede establecer la etiqueta Fecha de toma/Fecha y hora usando ExifInterface en Android

Lo que intento hacer es establecer la etiqueta Fecha de entrada (Tag_DateTime) en los datos Exif de un archivo JPEG dentro de una aplicación de Android. Ya tengo un código de trabajo para configurar las etiquetas Latitude y Longitute, pero no puedo obtener la etiqueta Date date para establecer.

Aquí está el código:

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 - el lugar que se utiliza para obtener el tiempo en milisegundos.
  • fmt_Exif - SimpleDateFormat se utiliza para formatear el tiempo de milisegundos en el formato correcto para la etiqueta TAG_DateTime Exif.
  • strLat & strLong - Rellenar en otro lugar en el formato correcto para establecer las etiquetas de latitud y longitud.

He leído en una publicación de algún lugar que la etiqueta debe escribirse en el formato de milisegundos, por lo que he intentado esto también en vano. Para confirmar mi formateo con lo que realmente está almacenado, leí y entregué la etiqueta sin formato de un archivo jpeg que tiene la etiqueta Fecha de toma, pero el resultado está en exactamente el mismo formato que el que estoy escribiendo para la etiqueta y su sigue sin funcionar.

También vale la pena mencionar que he buscado en la clase Sanselan para hacer esto, y debido a la complejidad y la falta de ejemplos, preferiría intentar que mi solución existente funcione antes de cambiar a una completamente diferente.

¿Alguien ha logrado hacer esto y, si es así, qué estoy haciendo mal?

+0

¿Encontró alguna solución? Si trato de configurar el campo "DateTime", hay dos de tales campos en los datos EXIF ​​después de guardar ... – pbu

Respuesta

4

ExifInterface de Android, descarta de manera molesta y silenciosa cualquier dato que considere no válido. Peor aún, la documentación ni siquiera menciona qué valores válidos podrían ser.

También he encontrado que si especifica un atributo EXIF ​​que Android no puede descifrar (IE: no es una de las constantes TAG_ de ExifInterface), también lo ignorará por completo, y también fallará en silencio.

2

Tengo el mismo problema contigo. Cuando trato de usar TAG_DATETIME para guardar la fecha tomada, no funciona, y se ha perdido la fecha_pretada original. Realmente no sé la diferencia entre la función @hide de getDateTime() y getGpsDateTime(). Parece que getGpsDateTime() es la fecha tomada. Y probaré TAG_GPS_DATESTAMP y 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; 
    } 
} 
6

Necesitaba lo mismo ahora. He leído esta EXIF article from MIT y llegué a ser escrito 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"); 

Qué tenía este aspecto previamente:

exif 1

exif 2

Tenga en cuenta que esto en el EXIF ​​/ TIFF y secciones de GPS solamente, no las marcas de tiempo originales y digitalizadas reales:

exif 3

quería cambiar las marcas de tiempo originales y digitalizados también, así que trató la JHeader biblioteca:

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

con este añadido en onCreate:

JpegHeaders.preheat(); 

y funcionó:

exif 4

exif 5

veo este post es de diciembre así que quizás el código de Android ExifInterface he publicado anteriormente no funcionó con esa versión del SDK, pero estoy adivinando el enfoque de las librerías JHeader funcionaría.

1

Usted puede tratar igual que lo han hecho en ExifInterface.java

private static SimpleDateFormat sFormatter; 

    static { 
     sFormatter = new SimpleDateFormat("yyyy:MM:dd HH:mm:ss"); 
     sFormatter.setTimeZone(TimeZone.getTimeZone("UTC")); 
    } 

Y luego actualizar:

exif.setAttribute(ExifInterface.TAG_DATETIME, 
          sFormatter.format(new Date(System.currentTimeMillis()))); 
0
SimpleDateFormat dateTimeFormat = new SimpleDateFormat("yyyy:MM:dd HH:mm:ss"); 

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

que funciona para mí (al menos el nivel API 14+)

-1

Me enfrenté al problema de que las imágenes de Nexus 6 y Lumia 935 son sin CreateDate y DateTimeOriginal campos.

Android y Windows Phone guardar la marca de tiempo también en el nombre del archivo IMG_20160320_145825.jpg WP_20160328_13_40_42_Pro.jpg

tengo éxito para solucionar este problema y agregue el campo de ejecutar este script:

#! /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" 

I espero que ayude a alguien

Cuestiones relacionadas