Что я хочу сделать:
Сделайте снимок, используя мою собственную PictureActivity*, и добавьте данные EXIF (геотеги)
*: Реализация SurfaceHolder.Callback
и использование Камера
Что не работает:
Добавление данных EXIF GPS
Что я пробовал:
Используя ExifInterface
и ручную установку Camera.Parameters
(как с помощью специальных методов для установки метаданных GPS, так и с помощью params.set(String, Value)
).
Я загружаю изображения на Flickr с помощью FlickrJ (да, я настроил Flickr для импорта данных GPS — другие изображения работают нормально), однако этот инструмент также сообщает об отсутствии данных GPS в EXIF: http://regex.info/exif.cgi
Что я упустил?
(Android 2.2, HTC Desire)
Изменить:
- Камера настроена на Фотографии с геотегами: Вкл.
- Я пробовал с жестко закодированными фиктивными позициями GPS
Вот код для ручной настройки параметров (пробовал как с предварительным удалением данных GPS, так и без него, и как упоминалось также с 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);
}
Вот код для использования 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());
}
Вот код для записи файла JPEG в 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);
}
}
};
Также пытался записать образ из Bitmap
(не сработало), плюс еще один вопрос: запись отчета с использованием FileOutputStream
сработала