【发布时间】:2012-05-10 09:51:37
【问题描述】:
我想做什么:
使用我自己的 PictureActivity* 拍照并添加 EXIF(地理标签)数据
*:实现SurfaceHolder.Callback并使用Camera
什么不工作:
添加 EXIF GPS 数据
我尝试过的:
使用ExifInterface和手动设置Camera.Parameters(都使用设置GPS元数据的具体方法和使用params.set(String, Value))。
我正在使用 FlickrJ 将图片上传到 Flickr(是的,我已将 Flickr 设置为导入 GPS 数据——其他图片工作正常),但是此工具还显示 EXIF 中没有 GPS 数据:http://regex.info/exif.cgi
我错过了什么?
(Android 2.2,HTC Desire)
编辑:
- 相机设置为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);
}
这里是使用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 编写的工作
【问题讨论】: