Что я хочу сделать:
Сфотографируйте, используя свой собственный PictureActivity * и добавить EXIF (Геотэги) данные
*: Реализация SurfaceHolder.Callback
и использование Camera
Запись/Геотег JPEGs (EXIF данных) в Android
Что не работает:
Добавление данных 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)
Edit:
- Камера установлена в Geotag photos: On
- Я пытался с закодированными фиктивными позициями 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);
}
Her е код для использования 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
работал
Для отрицательных широт и долгот код выше будет кодировать отрицательные значения, а не положительные. Например (-40.00, -73.00) будет закодирован как -40 градусов по широте на юг вместо +40 градусов к югу. -73 будет кодироваться как -73 градуса долготы на запад вместо +73 градусов долготы на запад). – Theo
Как правило, это не должно считаться правильным ответом, поскольку код имеет недостатки (проблема с math.floor и т. Д.) – seanpj