LocationServices.SettingsApi已弃用,如何改造GoogleApiClient定位代码?
适配弃用的
LocationServices.SettingsApi,改造定位功能方案 嘿,我来帮你把旧的定位代码改成当前Google官方推荐的新方案——毕竟LocationServices.SettingsApi确实早就被弃用了,现在官方更推荐用Fused Location Provider Client和Settings Client来实现定位,不仅代码更简洁,还不用再手动管理GoogleApiClient的连接状态了。
第一步:确保依赖正确
首先检查你的build.gradle(Module级别)里,已经引入了最新的定位服务依赖:
dependencies { implementation 'com.google.android.gms:play-services-location:21.0.1' // 可替换为当前最新版本 }
第二步:替换核心组件
把原来的GoogleApiClient、LocationServices.SettingsApi替换成以下两个核心类:
FusedLocationProviderClient:负责请求位置更新、获取当前位置SettingsClient:负责检查并引导用户开启必要的定位设置(替代原来的SettingsApi)
第三步:完整代码改造示例
下面是对应你原有代码的改造版本,以Activity为例:
1. 声明成员变量
private FusedLocationProviderClient mFusedLocationClient; private SettingsClient mSettingsClient; private LocationRequest mLocationRequest; private LocationCallback mLocationCallback; private LocationSettingsRequest mLocationSettingsRequest; private static final int REQUEST_CHECK_SETTINGS = 1001; // 替换成你原来定义的时间常量 private static final long UPDATE_INTERVAL_IN_MILLISECONDS = 10000; private static final long FASTEST_UPDATE_INTERVAL_IN_MILLISECONDS = 5000;
2. 初始化组件(比如在onCreate里)
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 初始化客户端 mFusedLocationClient = LocationServices.getFusedLocationProviderClient(this); mSettingsClient = LocationServices.getSettingsClient(this); // 配置LocationRequest(和你原来的配置逻辑一致) mLocationRequest = LocationRequest.create(); mLocationRequest.setInterval(UPDATE_INTERVAL_IN_MILLISECONDS); mLocationRequest.setFastestInterval(FASTEST_UPDATE_INTERVAL_IN_MILLISECONDS); mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY); // 构建LocationSettingsRequest,用于检查定位设置 LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder(); builder.addLocationRequest(mLocationRequest); mLocationSettingsRequest = builder.build(); // 定义位置更新回调 mLocationCallback = new LocationCallback() { @Override public void onLocationResult(LocationResult locationResult) { super.onLocationResult(locationResult); // 处理获取到的位置数据 if (locationResult != null && !locationResult.getLocations().isEmpty()) { Location currentLocation = locationResult.getLocations().get(0); // 这里做你需要的操作,比如更新UI、上传位置等 } } }; }
3. 检查定位设置并请求位置更新
你可以在需要启动定位的地方(比如按钮点击、onStart方法里)调用这个方法:
private void startLocationUpdates() { // 先检查定位设置是否满足要求 mSettingsClient.checkLocationSettings(mLocationSettingsRequest) .addOnSuccessListener(this, locationSettingsResponse -> { // 设置满足要求,开始请求位置更新 // 注意:需确保已申请定位权限(ACCESS_FINE_LOCATION/ACCESS_COARSE_LOCATION) mFusedLocationClient.requestLocationUpdates(mLocationRequest, mLocationCallback, Looper.getMainLooper()); }) .addOnFailureListener(this, e -> { int statusCode = ((ApiException) e).getStatusCode(); switch (statusCode) { case LocationSettingsStatusCodes.RESOLUTION_REQUIRED: // 定位设置不满足,引导用户修改 try { 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; } }); }
4. 处理设置界面的返回结果
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == REQUEST_CHECK_SETTINGS) { switch (resultCode) { case RESULT_OK: // 用户同意修改设置,重新启动位置更新 startLocationUpdates(); break; case RESULT_CANCELED: // 用户拒绝修改设置,提示用户 Toast.makeText(this, "需要开启定位才能获取位置信息", Toast.LENGTH_SHORT).show(); break; } } }
5. 停止位置更新(重要!)
在合适的生命周期(比如onPause、onDestroy)里停止位置更新,避免不必要的电量消耗:
@Override protected void onPause() { super.onPause(); mFusedLocationClient.removeLocationUpdates(mLocationCallback); }
额外注意点
- 权限处理:别忘了在
AndroidManifest.xml里声明定位权限,并且在Android 6.0及以上版本中动态申请ACCESS_FINE_LOCATION或ACCESS_COARSE_LOCATION,否则定位请求会直接失败。 - 生命周期管理:根据你的业务需求,选择合适的时机启动/停止位置更新,比如在App进入后台时停止,回到前台时重新启动。
内容的提问来源于stack exchange,提问作者gogoloi
相关产品推荐
相关产品推荐

