无法通过Android上的Google相册中的照片获取位置数据

时间:2016-05-11 23:14:25

标签: android geolocation exif google-photos

问题: 我正在使用意图允许用户选择照片。当他们从设备上的图像中选择照片时,我可以使用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.

1 个答案:

答案 0 :(得分:0)

  

我正在使用它将流写入本地文件以获取照片。

天哪,可怕的代码。

如果要制作内容的本地文件副本:

  1. openInputStream()上致电ContentResolver,传递您从Google相册或其他任何地方获取的Uri

  2. 给自己一个OutputStream放置文件的位置

  3. 使用普通Java I / O从InputStream复制到OutputStream

  4. 这不仅速度更快,内存更少,而且出于您的目的,它还会保留EXIF标头。然后,您可以使用ExifInterface来访问这些内容。