从onActivityResult中的图库图像中检索EXIF数据

时间:2015-01-20 05:25:45

标签: android image geolocation exif

目前,我正在从图库中获取图像,并使用它填充imageField。我试图从图像中提取位置信息,假设它存在,但我得到的只是空值。

我知道我正在测试的图像在其EXIF数据中包含纬度和经度条目。

我已经尝试了我在网上找到的所有内容,但没有任何工作。我认为问题在于将不正确的参数发送到ExifInterface。这就是我现在所拥有的:

...

else if (requestCode == REQUEST_IMAGE_FROM_GALLERY) {
        try {
            Uri selectedImage = data.getData();
            String currentImage = selectedImage.getPath()
            + File.separator + getFileName(selectedImage);
....

然后初始化ExifInterface:

....

try {
    ExifInterface ei = new ExifInterface(currentImage);
    imageLatitude = ei.getAttribute(ExifInterface.TAG_GPS_LATITUDE);
    imageLongitude = ei.getAttribute(ExifInterface.TAG_GPS_LONGITUDE);
....

但是imageLatitude和imageLongitude返回null。我甚至将发送到ExifInterface中的参数替换为图像的完整路径(/storage/emulated/0/DCIM/Camera/IMG_20150119_170010.jpg),但仍然获得空值。

究竟应该传递给ExifInterface,如果我传入正确的参数,为什么我会得到空值?

2 个答案:

答案 0 :(得分:1)

我最终使用这种方法让它工作:

private String getRealPathFromURI(Uri contentURI, Activity activity) {
    Cursor cursor = activity.getContentResolver()
                    .query(contentURI, null, null, null, null);
    if (cursor == null) { // Source is Dropbox or other similar local file
        // path
        return contentURI.getPath();
    } else {
        cursor.moveToFirst();
        int idx = cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA);
        return cursor.getString(idx);
    }
}

请在此处查看:

if (requestCode == REQUEST_IMAGE_FROM_GALLERY) {
        try {
            Uri selectedImage = data.getData();
            String currentImageFile = getRealPathFromURI(selectedImage, this);

            ExifInterface ei = new ExifInterface(currentImageFile);

这提供了一个合适的ExifInterface,允许我从图像中提取所需的数据(它存在的位置)。

感谢大家的投入。

答案 1 :(得分:0)

您传递给ExifInterface的图像路径可能无效,您可以使用以下代码进行检查:

File file = new File(currentImage); 
if(file.exists()){ 
// print file exist
}else{
 // print file not exist.
}

如果是问题,您可以通过传递有效的图像路径来解决它。如果不是问题,您可以通过在以下代码之前添加断点来调试代码并查看ExifInterface ei对象中的属性:

imageLatitude = ei.getAttribute(ExifInterface.TAG_GPS_LATITUDE);