前言
最近寫一個lib竖螃,多選圖片時芦劣,可以按照地理位置分組院尔。android Q之前的版本箫荡,直接可以通過path路徑的形式去獲取圖片的地理位置魁亦,但在Android Q版本上無法使用path路徑形式訪問了,就導致無法獲取圖片位置了羔挡。
解決方案
官方給出的解決方法是:圖片的位置信息屬于敏感權(quán)限洁奈,需要先在Manifest中申請ACCESS_MEDIA_LOCATION
權(quán)限哼御,然后通過MediaStore.setRequireOriginal(uri)
的方式睹逃,拿到圖片原始的URI归斤,才能夠獲取到圖片的位置信息豹悬。
那么在實際的操作下谤祖,僅僅只在Manifest中申請權(quán)限是不夠的酬核,需要動態(tài)的去申請這個權(quán)限庆捺。部分手機動態(tài)申請是沒有任何提示的榨汤,但實際上是申請成功了军掂,比如華為的手機轮蜕。部分手機申請是有權(quán)限框彈出的,用戶點擊確認后才能使用良姆,比如小米的手機肠虽。
Android 11 雖然又能以path的方式訪問共享媒體庫,但圖片位置作為敏感權(quán)限玛追,依然需要以上的操作才能獲取到正確的圖片位置信息税课。
代碼
通過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);
}
開啟數(shù)據(jù)流:
InputStream inputStream = context.getContentResolver().openInputStream(uri);
獲取圖片的經(jīng)緯度:
ExifInterface exifInterface;
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
exifInterface = new ExifInterface(st);
}else {
exifInterface = new ExifInterface(path);
}
double[] latLong = exifInterface.getLatLong();
操作完記得關(guān)掉流闲延,防止內(nèi)存泄漏。
結(jié)語
坑韩玩,總要一個一個的爬垒玲。