You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

位置设置弹窗未点击确认/取消就触发OnFailureListener错误如何解决

问题原因

  • 你日志输出的错误码6对应LocationSettingsStatusCodes.RESOLUTION_REQUIRED,是checkLocationSettings接口本身的位置设置校验结果,和后续弹窗交互无关,触发时机是系统完成位置配置校验的瞬间,并非用户点击弹窗之后。
  • 你的原有认知存在偏差:OnSuccessListener/OnFailureListener是checkLocationSettings方法自身的结果回调,仅反馈当前系统位置设置是否满足你的请求条件:
    • 若当前设置已经符合高精度定位要求,会直接触发OnSuccessListener,不会弹出提示弹窗
    • 若当前设置不符合要求但可通过弹窗引导用户修改,就会触发OnFailureListener返回错误码6,你在该分支调用rae.startResolutionForResult才会弹出系统位置启用提示弹窗
  • 因此你遇到的「弹窗刚弹出就触发OnFailureListener」是符合API设计的正常表现,不是运行异常。

获取用户弹窗交互结果的实现方法

弹窗的用户操作结果需要通过Activity的结果回调接口获取,有两种实现方式:

传统onActivityResult方案(兼容低版本项目)

  1. 确保你的Activity中已经定义了唯一的请求码常量,示例如下:
private static final int REQUEST_CHECK_SETTINGS = 1001;
  1. 重写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方案(推荐,避免请求码冲突)

  1. 提前在Activity中注册结果回调:
private ActivityResultLauncher<IntentSenderRequest> locationSettingsLauncher = registerForActivityResult(
        new ActivityResultContracts.StartIntentSenderForResult(),
        result -> {
            if (result.getResultCode() == RESULT_OK) {
                Log.d("MyApp", "用户同意开启高精度定位");
                // 执行后续定位逻辑
            } else {
                Log.d("MyApp", "用户拒绝开启高精度定位");
            }
        }
);
  1. 替换原有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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 04:36:04