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

使用LocationServices.getSettingsClient()禁用位置后addOnFailureListener不触发

问题根因
  • 核心原因是LocationSettingsRequest构建时未开启setAlwaysShow(true)配置,系统默认会缓存历史校验结果,只要用户此前同意过位置授权,后续即使手动关闭位置服务,checkLocationSettings也会直接返回成功回调,不会触发失败逻辑
  • 你当前拆分OnSuccessListener和OnFailureListener的写法,无法在成功回调中直接获取状态码,实际上Task对象本身就支持直接获取Status,无需依赖异常返回
解决方案

1. 修正LocationSettingsRequest构建逻辑

添加setAlwaysShow(true)强制每次校验都实时读取当前位置状态,不走缓存,同时明确位置请求优先级:

// 先确保LocationRequest配置正确
mLocationRequest = LocationRequest.create();
mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY); // 高精度模式会强制校验GPS状态
mLocationRequest.setInterval(10000);
mLocationRequest.setFastestInterval(5000);

LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder()
        .addLocationRequest(mLocationRequest)
        .setAlwaysShow(true); // 关键配置:禁用缓存,每次实时校验位置设置

2. 统一使用OnCompleteListener处理校验结果

不管成功失败都可以直接拿到Status,无需拆分两个回调,完美适配你需要的状态判断逻辑:

Task<LocationSettingsResponse> result = LocationServices.getSettingsClient(requireContext())
        .checkLocationSettings(builder.build());

result.addOnCompleteListener(requireActivity(), task -> {
    try {
        LocationSettingsResponse response = task.getResult(ApiException.class);
        // 位置设置满足要求,直接执行定位逻辑
        Log.i(TAG, "All location settings are satisfied.");
    } catch (ApiException e) {
        switch (e.getStatusCode()) {
            case LocationSettingsStatusCodes.RESOLUTION_REQUIRED:
                Log.i(TAG, "Location settings are not satisfied. Show the user a dialog to upgrade location settings ");
                try {
                    // 唤起位置开启弹窗
                    ResolvableApiException resolvable = (ResolvableApiException) e;
                    // 若使用AndroidX建议替换为Activity Result API写法
                    resolvable.startResolutionForResult(requireActivity(), REQUEST_CHECK_SETTINGS);
                } catch (IntentSender.SendIntentException sendEx) {
                    // 忽略发送异常
                }
                break;
            case LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE:
                Log.i(TAG, "Location settings are inadequate, and cannot be fixed here. Dialog not created.");
                break;
        }
    }
});

3. 兜底场景补充

如果仍需要在成功回调中额外判断GPS状态,可以直接从返回结果中读取状态后补充校验:

LocationSettingsStates states = response.getLocationSettingsStates();
if (!states.isGpsUsable()) {
    // 手动触发一次位置设置校验,强制走失败回调唤起弹窗
    LocationServices.getSettingsClient(requireContext())
            .checkLocationSettings(builder.build())
            .addOnFailureListener(e -> {
                // 复用上述失败处理逻辑即可
            });
}

内容的提问来源于stack exchange,提问作者Kruti Bhatt

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.08 19:39:02