Quello che voglio fare:
scattare una fotografia con la mia PictureActivity * e aggiungere EXIF (geotag) dati
*: Implementazione SurfaceHolder.Callback
e utilizzando Camera
scrittura/Geotag JPEG (dati EXIF) in Android
Cosa non funziona:
Aggiungendo i dati GPS EXIF
Quello che ho provato:
Utilizzando la ExifInterface
e impostare manualmente Camera.Parameters
(sia con i metodi specifici per l'impostazione GPS meta-dati e usando params.set(String, Value)
).
sto caricando le immagini su Flickr utilizzando FlickrJ (sì, ho impostato Flickr per importare i dati GPS - altre immagini funzionano bene), tuttavia questo strumento dice anche non ci sono dati GPS nella EXIF: http://regex.info/exif.cgi
Cosa mi manca?
(Android 2.2, HTC Desire)
Edit:
- La fotocamera è impostata per Geotag photos: On
- Ho provato con le posizioni GPS fittizi hardcoded
Ecco il codice per i parametri di impostazione manuale (provato con e senza rimuovere prima i dati GPS, e come detto anche 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);
}
suo e è il codice per l'utilizzo del 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());
}
Ecco il codice per scrivere il file JPEG alla 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);
}
}
};
provato anche a scrivere l'immagine da una Bitmap
(non ha funzionato) , più un altro domanda qui la reportistica utilizzando un FileOutputStream
lavorato
Per latitudini e longitudini negativi il codice sopra codificherà valori negativi invece di quelli positivi. Ad esempio (-40,00, -73,00) sarà codificato come -40 gradi di latitudine sud invece di +40 gradi sud. -73 sarà codificato come -73 gradi di longitudine ovest invece di +73 gradi di longitudine ovest). – Theo
Generalmente non dovrebbe essere considerata la risposta corretta, dal momento che il codice è difettoso (problema matematico, ecc ...) – seanpj