安卓10及其之后的版本,提高了系统的隐私安全,类似如图片的GPS信息这样的exif数据无法直接获取了。如果使用之前的方法获取,则得到的GPS信息始终是0,0。那么如何解决该问题呢?

  • 首先在Activity的onCreate函数中,判断是否拥有图片GPS信息的权限,这个权限的名称为ACCESS_MEDIA_LOCATION
private boolean isAccessMediaLocationGranted() {
    if (android.os.Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) {
        return true;
    } else {
        return getBaseContext().checkSelfPermission(android.Manifest.permission.ACCESS_MEDIA_LOCATION)
                == PackageManager.PERMISSION_GRANTED;
    }
}
  • 如果没有这个权限,那么就需要请求权限,请求权限的代码如下
if (!isAccessMediaLocationGranted()) {
    ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_MEDIA_LOCATION}, IMAGE_LOCATION);
}
  • 如果已经获得权限,那么首先将得到图片的Uri转换成真是的Uri,然后再通过ExifInterface获取GPS信息
//如果是Q10版本一下,则不需要得到原来的Uri
if (android.os.Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) {
    currentMediaRealUri = mediaUri;
} else {
    //隐私信息,导致gps信息无法获取:https://stackoverflow.com/questions/57980935/exifinterface-gps-not-read-on-android-q-10
    currentMediaRealUri = MediaStore.setRequireOriginal(mediaUri);
}

……

String longitude = exif.getAttribute(ExifInterface.TAG_GPS_LONGITUDE);
String latitude = exif.getAttribute(ExifInterface.TAG_GPS_LATITUDE);