Android Q ExifInterface获取图片位置

前言

最近写一个lib,多选图片时,可以按照地理位置分组。android Q之前的版本,直接可以通过path路径的形式去获取图片的地理位置,但在Android Q版本上无法使用path路径形式访问了,就导致无法获取图片位置了。

解决方案

官方给出的解决方法是:图片的位置信息属于敏感权限,需要先在Manifest中申请ACCESS_MEDIA_LOCATION权限,然后通过MediaStore.setRequireOriginal(uri)的方式,拿到图片原始的URI,才能够获取到图片的位置信息。

那么在实际的操作下,仅仅只在Manifest中申请权限是不够的,需要动态的去申请这个权限。部分手机动态申请是没有任何提示的,但实际上是申请成功了,比如华为的手机。部分手机申请是有权限框弹出的,用户点击确认后才能使用,比如小米的手机。

Android 11 虽然又能以path的方式访问共享媒体库,但图片位置作为敏感权限,依然需要以上的操作才能获取到正确的图片位置信息。

代码

通过Cursor读取媒体库图片:

Cursor cursor = context.getContentResolver().query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
                    imageProjection,
                    null,
                    null,
                    imageProjection[2] + " DESC");

获取图片uri:

Uri uri = Uri.withAppendedPath(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Images.ImageColumns._ID)));

获取图片原始uri:

if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
    uri = MediaStore.setRequireOriginal(uri);
}

开启数据流:

InputStream inputStream = context.getContentResolver().openInputStream(uri);

获取图片的经纬度:

ExifInterface exifInterface;
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
    exifInterface = new ExifInterface(st);
}else {
    exifInterface = new ExifInterface(path);
}
double[] latLong = exifInterface.getLatLong();

操作完记得关掉流,防止内存泄漏。

结语

坑,总要一个一个的爬。

你可能感兴趣的:(Android Q ExifInterface获取图片位置)