Những gì tôi muốn làm:
Chụp ảnh bằng PictureActivity riêng tôi * và thêm EXIF (thẻ địa lý) dữ liệu
*: Thực hiện SurfaceHolder.Callback
và sử dụng Camera
Viết/Geotag JPEG (dữ liệu EXIF) trong Android
gì không hoạt động:
Thêm dữ liệu EXIF GPS
những gì tôi đã cố gắng:
Sử dụng ExifInterface
và tự thiết lập Camera.Parameters
(cả với các phương pháp cụ thể để thiết lập GPS meta-data và bằng cách sử dụng params.set(String, Value)
).
Tôi đang tải lên các hình ảnh lên Flickr sử dụng FlickrJ (vâng, tôi đã thiết Flickr để nhập dữ liệu GPS - hình ảnh khác làm việc tốt), tuy nhiên công cụ này cũng nói rằng không có dữ liệu GPS trong EXIF: http://regex.info/exif.cgi
Tôi đang thiếu gì?
(Android 2.2, HTC Desire)
Edit:
- Chiếc máy ảnh này được thiết lập để Geotag photos: On
- Tôi đã thử với vị trí GPS giả hardcoded
Đây là đoạn mã để cài đặt bằng tay các thông số (đã thử cả khi có và không xóa dữ liệu GPS lần đầu tiên và như đã đề cập với 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);
}
Cô ấy e là mã để sử dụng 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());
}
Đây là đoạn mã để viết các tập tin 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);
}
}
};
Cũng đã cố gắng viết các hình ảnh từ một Bitmap
(không làm việc) , cộng với một câu hỏi ở đây báo cáo bằng văn bản sử dụng một FileOutputStream
làm việc
Đối với vĩ độ và kinh độ tiêu cực các mã trên sẽ mã hóa các giá trị tiêu cực thay vì tích cực. Ví dụ (-40.00, -73.00) sẽ được mã hóa ở vĩ độ -40 độ về phía nam thay vì +40 độ về phía nam. -73 sẽ được mã hóa là -73 độ kinh độ tây thay vì +73 độ kinh độ tây). – Theo
Nói chung nó không nên được coi là câu trả lời đúng, vì mã là thiếu sót (math.floor vấn đề vv ...) – seanpj