LocationServices.SettingsApi已废弃,如何修改旧代码适配新版本?
如何替换已废弃的LocationServices.SettingsApi代码?
嘿,我前阵子刚踩过这个坑!Google在Play Services的更新里把LocationServices.SettingsApi给废弃了,现在推荐用SettingsClient配合FusedLocationProviderClient来实现相同的功能,代码逻辑更简洁,也更符合现在的架构风格。
先给你直接上修改后的完整代码,你可以直接替换原来的那段:
// 1. 替换GoogleApiClient为这两个客户端 private FusedLocationProviderClient mFusedLocationClient; private SettingsClient mSettingsClient; // 初始化部分 mFusedLocationClient = LocationServices.getFusedLocationProviderClient(this); mSettingsClient = LocationServices.getSettingsClient(this); // 2. LocationRequest的构建和原来一样,不用改 mLocationRequest = new LocationRequest(); mLocationRequest.setInterval(UPDATE_INTERVAL_IN_MILLISECONDS); mLocationRequest.setFastestInterval(FASTEST_UPDATE_INTERVAL_IN_MILLISECONDS); mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY); // 3. 构建LocationSettingsRequest的方式也基本不变 LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder(); builder.addLocationRequest(mLocationRequest); builder.setAlwaysShow(true); LocationSettingsRequest mLocationSettingsRequest = builder.build(); // 4. 关键变化:用SettingsClient的checkLocationSettings替代原来的SettingsApi mSettingsClient.checkLocationSettings(mLocationSettingsRequest) .addOnSuccessListener(this, new OnSuccessListener<LocationSettingsResponse>() { @Override public void onSuccess(LocationSettingsResponse locationSettingsResponse) { // 位置设置符合要求,可以开始请求位置了 // 这里可以调用mFusedLocationClient.requestLocationUpdates(...) } }) .addOnFailureListener(this, new OnFailureListener() { @Override public void onFailure(@NonNull Exception e) { int statusCode = ((ApiException) e).getStatusCode(); switch (statusCode) { case LocationSettingsStatusCodes.RESOLUTION_REQUIRED: // 位置设置不符合要求,但可以通过弹窗让用户修改 try { // 启动位置设置的意图,记得在onActivityResult里处理结果 ResolvableApiException resolvable = (ResolvableApiException) e; resolvable.startResolutionForResult(MainActivity.this, REQUEST_CHECK_SETTINGS); } catch (IntentSender.SendIntentException sendEx) { // 忽略这个异常就行 } break; case LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE: // 位置设置无法修改,只能提示用户手动开启 Toast.makeText(MainActivity.this, "请手动开启位置服务", Toast.LENGTH_SHORT).show(); break; } } });
给你划几个核心变化点:
- 彻底抛弃
GoogleApiClient:现在不需要手动管理连接状态了,客户端会自动处理,省了好多冗余代码 - 回调逻辑更直观:用
addOnSuccessListener和addOnFailureListener替代原来的PendingResult,流程更清晰 - 错误处理更明确:在
onFailure里可以直接根据状态码判断是需要弹窗引导用户修改,还是无法调整设置
另外,别忘了处理用户修改位置设置后的结果,比如在onActivityResult里:
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == REQUEST_CHECK_SETTINGS) { if (resultCode == RESULT_OK) { // 用户同意修改了位置设置,可以开始请求位置了 } else { // 用户拒绝修改,提示或者做其他降级处理 } } }
如果你的项目已经迁移到AndroidX的Activity Result API,也可以用registerForActivityResult来替代传统的onActivityResult,代码会更优雅哦!
内容的提问来源于stack exchange,提问作者gogoloi
相关产品推荐
相关产品推荐

