升级定位库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
相关产品推荐
相关产品推荐

