问题: 我正在使用意图允许用户选择照片。当他们从设备上的图像中选择照片时,我可以使用ExifInterface获取经度和纬度。然而,当他们从Google相册中选择照片时,我无法从uri返回地理位置。
详情: 我正在使用的意图如下:
Intent intent = new Intent();
// Show only images, no videos or anything else
intent.setType("image/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true);
// Always show the chooser (if there are multiple options available)
startActivityForResult(Intent.createChooser(intent, "Select Pictures"), PICK_IMAGES_REQUEST);
当用户从Google照片中选择未存储在设备上的照片时,Google照片会首先下载照片并返回不包含设备位置的URI。我正在使用this将流写入本地文件以获取照片。然后我尝试使用ContentResolver从流中获取日期,纬度和经度,如下所示:
Cursor cursor = context.getContentResolver().query(uri,
new String[] {
MediaStore.Images.ImageColumns.DATE_TAKEN,
MediaStore.Images.ImageColumns.LATITUDE,
MediaStore.Images.ImageColumns.LONGITUDE
}, null, null, null);
if (null != cursor) {
if (cursor.moveToFirst()) {
int dateColumn = cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATE_TAKEN);
photoItem.date = new Date(cursor.getLong(dateColumn));
int latitudeColumn = cursor.getColumnIndex(MediaStore.Images.ImageColumns.LATITUDE);
double latitude = cursor.getDouble(latitudeColumn);
int longitudeColumn = cursor.getColumnIndex(MediaStore.Images.ImageColumns.LONGITUDE);
double longitude = cursor.getDouble(longitudeColumn);
photoItem.photoGeoPoint = new LatLng(latitude, longitude);
}
cursor.close();
}
这适用于所采取的日期。但是纬度和经度始终为0.我已经验证了我正在尝试使用的照片在exif中嵌入了地理位置。有什么想法吗?
- 的修改 -
因此,使用@CommonsWare的建议我更新了我的代码,直接从流写入文件,而不是先将其转换为位图。代码如下所示( in 是来自Google相册contentResolver的InputStream):
try {
File outputDir = AppState.getInstance().getCacheDir();
File outputFile = File.createTempFile("tempImageFile", ".jpg", outputDir);
OutputStream out = new FileOutputStream(outputFile);
byte[] buf = new byte[1024];
int len;
while((len=in.read(buf))>0){
out.write(buf,0,len);
}
out.close();
in.close();
ExifInterface exif = new ExifInterface(outputFile.getPath());
Logger.d(LOG_TAG, "lat is: " + exif.getAttribute(ExifInterface.TAG_GPS_LATITUDE));
Logger.d(LOG_TAG, "lon is: " + exif.getAttribute(ExifInterface.TAG_GPS_LONGITUDE));
} catch (Exception e) {
e.printStackTrace();
}
然而,纬度和经度仍为空(同样,我已经在照片中验证了位置数据的存在)。 ExifInterface中唯一的值是LightSource = 0,Orientation = 1,ImageLength = 3264,MeteringMode = -1和ImageWidth = 2448.
答案 0 :(得分:0)
我正在使用它将流写入本地文件以获取照片。
天哪,可怕的代码。
如果要制作内容的本地文件副本:
在openInputStream()
上致电ContentResolver
,传递您从Google相册或其他任何地方获取的Uri
给自己一个OutputStream
放置文件的位置
使用普通Java I / O从InputStream
复制到OutputStream
这不仅速度更快,内存更少,而且出于您的目的,它还会保留EXIF标头。然后,您可以使用ExifInterface
来访问这些内容。