Android已声明定位权限调用fusedLocationClient仍报权限缺失如何解决
问题解决方案
1. 缺少权限申请结果回调处理
你当前仅在onCreate里触发了权限申请,但是ActivityCompat.requestPermissions是异步调用,你触发申请后直接return终止了后续逻辑,没有处理用户同意权限后的回调逻辑,定位相关的初始化代码始终没有被执行。需要在MainActivity中重写onRequestPermissionsResult方法,确认用户授予所有所需权限后再执行定位相关调用:
@Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); if (requestCode == 1) { boolean allGranted = true; for (int result : grantResults) { if (result != PackageManager.PERMISSION_GRANTED) { allGranted = false; break; } } if (allGranted) { // 在这里执行定位初始化、调用定位请求的逻辑 } else { // 处理权限被拒绝的场景,比如提示用户权限为功能必需 } } }
2. 调用定位方法处缺少显式权限判断
Android Studio的Lint静态检查只会校验调用风险方法的上下文有没有权限判断,不会跨文件检查你之前有没有申请过权限。你在独立Java文件中调用requestLocationUpdates时没有包裹权限判断逻辑,所以会触发红色波浪线报错。
你需要在调用该方法前增加权限校验逻辑:
if (ContextCompat.checkSelfPermission(context, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED && ContextCompat.checkSelfPermission(context, Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED) { fusedLocationClient.requestLocationUpdates(mLocationRequest, mLocationCallback, Looper.getMainLooper()); }
3. 高版本系统权限适配遗漏
如果你的targetSdkVersion >= 29(Android 10),且应用需要在后台运行时获取定位,需要在AndroidManifest.xml中额外添加权限:
<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />
同时动态申请时也要把这个权限加入申请列表。
如果targetSdkVersion >= 31(Android 12),使用精确定位时需要确保用户主动授予ACCESS_FINE_LOCATION权限,系统默认不会自动授予精确定位权限。
4. 冗余代码问题
你当前的MainActivity中重复定义了两次checkAndRequestPermissions方法,需要删除多余的重复定义,避免编译异常。
内容的提问来源于stack exchange,提问作者user15155006
相关产品推荐
相关产品推荐

