Lo que quiero hacer:
tomar una fotografía con mi propia PictureActivity * y añadir EXIF (etiquetas geográficas) de datos
*: Implementación SurfaceHolder.Callback
y el uso de Camera
escritura/Etiqueta geográfica imágenes JPEG (datos EXIF) en Android
Lo no está funcionando:
Adición de los datos EXIF GPS
lo que he intentado:
Utilizando el ExifInterface
y establecer manualmente Camera.Parameters
(ambos con los métodos específicos para la configuración del GPS meta-datos y usando params.set(String, Value)
).
estoy subiendo las imágenes a Flickr usando FlickrJ (sí, me he fijado en Flickr para importar datos GPS - otras imágenes funcionan bien), sin embargo esta herramienta también dice que no hay datos GPS en el EXIF: http://regex.info/exif.cgi
¿Qué me estoy perdiendo?
(Android 2.2, HTC Desire)
Editar:
- La cámara se ajusta a Geotag photos: On
- He tratado con posiciones GPS ficticias codificados
Aquí está el código para parámetros de ajuste manualmente (tratado con y sin quitar primero los datos del GPS, y como se mencionó también con set(String, Value)
):
@Override
public void surfaceCreated(SurfaceHolder holder) {
mCamera = Camera.open();
Camera.Parameters p = mCamera.getParameters();
p.setPreviewSize(p.getPreviewSize().width, p.getPreviewSize().height);
Log.e("PictureActivity", "EXIF: "+AGlanceLocationListener.getLatitude());
p.removeGpsData();
p.setGpsLatitude(AGlanceLocationListener.getLatitude());
p.setGpsLongitude(AGlanceLocationListener.getLongitude());
p.setGpsAltitude(AGlanceLocationListener.getAltitude());
p.setGpsTimestamp(AGlanceLocationListener.getTime());
mCamera.setParameters(p);
}
Su e es el código para utilizar el ExifInterface
:
//Save EXIF location data to JPEG
ExifInterface exif;
try {
exif = new ExifInterface("/sdcard/DCIM/"+filename+".jpeg");
exif.setAttribute(ExifInterface.TAG_GPS_LATITUDE,
String.valueOf(AGlanceLocationListener.getLatitude()));
exif.setAttribute(ExifInterface.TAG_GPS_LONGITUDE,
String.valueOf(AGlanceLocationListener.getLongitude()));
exif.saveAttributes();
} catch (IOException e) {
Log.e("PictureActivity", e.getLocalizedMessage());
}
Este es el código para escribir el archivo JPEG a la SDCARD:
Camera.PictureCallback jpegCallback = new Camera.PictureCallback() {
public void onPictureTaken(byte[] imageData, Camera c)
{
// Bitmap pic = BitmapFactory.decodeByteArray(imageData, 0, imageData.length);
String day = String.valueOf(Calendar.getInstance().getTime().getDay());
String hour = String.valueOf(Calendar.getInstance().getTime().getHours());
String minute = String.valueOf(Calendar.getInstance().getTime().getMinutes());
String second = String.valueOf(Calendar.getInstance().getTime().getSeconds());
filename = "Billede"+day+hour+minute+second;
try {
FileOutputStream fos = new FileOutputStream(new File("/sdcard/DCIM/"+filename+".jpeg"));
fos.write(imageData);
fos.flush();
fos.close();
} catch (Exception e) {
e.printStackTrace();
}
if(imageData != null){
Intent mIntent = new Intent();
setResult(0,mIntent);
PictureActivity.this.showDialog(0);
}
}
};
también trató de escribir la imagen de un Bitmap
(no funcionó) , además de otra pregunta aquí informe escrito utilizando un FileOutputStream
trabajaron
Para latitudes negativos y las longitudes el código anterior codificará valores negativos en lugar de los positivos. Por ejemplo (-40.00, -73.00) se codificará como -40 grados de latitud sur en lugar de +40 grados sur. -73 se codificará como -73 grados de longitud oeste en lugar de +73 grados de longitud oeste). – Theo
Generalmente, no se debe considerar la respuesta correcta, ya que el código es defectuoso (problema matemático del piso, etc.) – seanpj