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

升级定位库play-services-location:21.0.0遇ApiException转ResolvableApiException异常

解决play-services-location:21.0.0中定位设置弹窗的ClassCastException问题

在21.0.0版本的Google定位服务库中,checkLocationSettings抛出的ApiException不再直接继承ResolvableApiException,直接强制类型转换会触发ClassCastException。正确的处理方式是通过Status对象获取分辨率,而非强转异常类型。

修复后的代码示例:

val locationRequest = LocationRequest.Builder(Priority.PRIORITY_HIGH_ACCURACY, 10000)
    .setMinUpdateIntervalMillis(5000).build()

val builder = LocationSettingsRequest.Builder().addLocationRequest(locationRequest)

val client: SettingsClient = LocationServices.getSettingsClient(activity)
val task: Task<LocationSettingsResponse> = client.checkLocationSettings(builder.build())

task.addOnCompleteListener {
    try {
        task.getResult(ApiException::class.java)
        // 定位设置已满足,执行后续逻辑
    } catch (exception: ApiException) {
        when (exception.statusCode) {
            LocationSettingsStatusCodes.RESOLUTION_REQUIRED -> {
                try {
                    // 通过status获取resolution,替代强转异常操作
                    exception.status.resolution?.let { intentSender ->
                        // 推荐使用ActivityResultAPI(替代已废弃的startResolutionForResult)
                        val launcher = registerForActivityResult(ActivityResultContracts.StartIntentSenderForResult()) { result ->
                            if (result.resultCode == Activity.RESULT_OK) {
                                // 用户同意开启定位,继续后续流程
                            }
                        }
                        launcher.launch(IntentSenderRequest.Builder(intentSender).build())
                        
                        // 若仍需使用旧API(已废弃),可保留以下代码
                        // activity.startIntentSenderForResult(intentSender, 1, null, 0, 0, 0, null)
                    }
                } catch (e: Exception) {
                    e.printStackTrace()
                }
            }
            LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE -> {
                // 无法自动修改定位设置,提示用户手动开启
            }
        }
    }
}

关键说明:

  • 21.x版本后,ApiException不再是ResolvableApiException的直接实例,必须通过exception.status.resolution获取可跳转的IntentSender。
  • 优先使用ActivityResultAPI替代已废弃的startResolutionForResult,避免后续版本兼容性问题。
  • registerForActivityResult需在Activity/Fragment的生命周期早期(如onCreate)完成注册,防止内存泄漏。

内容的提问来源于stack exchange,提问作者Orest Hredil

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 06:25:19