位置设置弹窗未点击确认/取消就触发OnFailureListener错误如何解决
问题原因
- 你日志输出的错误码
6对应LocationSettingsStatusCodes.RESOLUTION_REQUIRED,是checkLocationSettings接口本身的位置设置校验结果,和后续弹窗交互无关,触发时机是系统完成位置配置校验的瞬间,并非用户点击弹窗之后。 - 你的原有认知存在偏差:
OnSuccessListener/OnFailureListener是checkLocationSettings方法自身的结果回调,仅反馈当前系统位置设置是否满足你的请求条件:- 若当前设置已经符合高精度定位要求,会直接触发
OnSuccessListener,不会弹出提示弹窗 - 若当前设置不符合要求但可通过弹窗引导用户修改,就会触发
OnFailureListener返回错误码6,你在该分支调用rae.startResolutionForResult才会弹出系统位置启用提示弹窗
- 若当前设置已经符合高精度定位要求,会直接触发
- 因此你遇到的「弹窗刚弹出就触发OnFailureListener」是符合API设计的正常表现,不是运行异常。
获取用户弹窗交互结果的实现方法
弹窗的用户操作结果需要通过Activity的结果回调接口获取,有两种实现方式:
传统onActivityResult方案(兼容低版本项目)
- 确保你的Activity中已经定义了唯一的请求码常量,示例如下:
private static final int REQUEST_CHECK_SETTINGS = 1001;
- 重写Activity的
onActivityResult方法,接收用户操作结果:
@Override protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == REQUEST_CHECK_SETTINGS) { switch (resultCode) { case RESULT_OK: // 用户点击确认,位置设置已修改完成,可在此执行定位等后续逻辑 Log.d("MyApp", "用户同意开启高精度定位"); break; case RESULT_CANCELED: // 用户点击取消,位置设置未修改 Log.d("MyApp", "用户拒绝开启高精度定位"); break; } } }
Jetpack Activity Result API方案(推荐,避免请求码冲突)
- 提前在Activity中注册结果回调:
private ActivityResultLauncher<IntentSenderRequest> locationSettingsLauncher = registerForActivityResult( new ActivityResultContracts.StartIntentSenderForResult(), result -> { if (result.getResultCode() == RESULT_OK) { Log.d("MyApp", "用户同意开启高精度定位"); // 执行后续定位逻辑 } else { Log.d("MyApp", "用户拒绝开启高精度定位"); } } );
- 替换原有
OnFailureListener分支中的弹窗调用代码:
case LocationSettingsStatusCodes.RESOLUTION_REQUIRED: try { ResolvableApiException rae = (ResolvableApiException) e; IntentSenderRequest intentSenderRequest = new IntentSenderRequest.Builder(rae.getResolution().getIntentSender()).build(); locationSettingsLauncher.launch(intentSenderRequest); } catch (IntentSender.SendIntentException sie) { Log.e("MyApp","Unable to execute request."); } break;
内容的提问来源于stack exchange,提问作者GeneCode
相关产品推荐
相关产品推荐

