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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 07:40:53