前言
最近写一个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();
操作完记得关掉流,防止内存泄漏。
结语
坑,总要一个一个的爬。