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

Android谷歌地图Activity中移除FusedLocationProviderClient持续定位更新方法

解决FusedLocationProviderClient停止定位更新的问题

嗨,我来帮你搞定这个停止定位更新的事儿!其实核心就是用FusedLocationProviderClient的removeLocationUpdates()方法,但关键是要注意使用请求更新时的同一个LocationCallback实例,这大概率是你之前没找到有效方案的原因。

步骤1:确认你持有LocationCallback的实例

首先,你得把当初请求定位更新时创建的LocationCallback保存为类的实例变量,而不是在请求方法里临时创建。比如:

// 声明为类的成员变量
private FusedLocationProviderClient locationClient;
private LocationCallback locationCallback; // 关键:保留这个实例

// 初始化和请求更新的代码
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    // ... 其他初始化代码

    locationClient = LocationServices.getFusedLocationProviderClient(this);

    // 创建LocationCallback实例并保存
    locationCallback = new LocationCallback() {
        @Override
        public void onLocationResult(LocationResult locationResult) {
            // 你原来处理定位结果的逻辑
            if (locationResult == null) {
                return;
            }
            for (Location location : locationResult.getLocations()) {
                // 更新地图或做其他操作
            }
        }
    };

    // 请求定位更新的代码(示例)
    LocationRequest locationRequest = LocationRequest.create();
    locationRequest.setInterval(10000); // 10秒间隔
    locationRequest.setFastestInterval(5000);
    locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);

    // 检查权限后请求更新(这里省略权限检查逻辑)
    locationClient.requestLocationUpdates(locationRequest, locationCallback, Looper.getMainLooper());
}

步骤2:调用removeLocationUpdates停止更新

在你需要停止定位的地方(比如Activity的onPause()、onDestroy(),或者某个按钮的点击事件),调用下面的代码:

// 停止定位更新
private void stopLocationUpdates() {
    if (locationClient != null && locationCallback != null) {
        locationClient.removeLocationUpdates(locationCallback)
                .addOnSuccessListener(aVoid -> {
                    // 停止成功的回调(可选)
                    Log.d("Location", "定位更新已停止");
                })
                .addOnFailureListener(e -> {
                    // 停止失败的处理(可选)
                    Log.e("Location", "停止定位更新失败", e);
                });
    }
}

比如在Activity的生命周期里调用:

@Override
protected void onPause() {
    super.onPause();
    stopLocationUpdates(); // 后台时停止更新,避免耗电
}

@Override
protected void onDestroy() {
    super.onDestroy();
    stopLocationUpdates(); // 销毁前确保停止
}

关键提醒

  • 一定要使用请求更新时的同一个LocationCallback实例,如果每次请求都新建一个Callback,那么调用remove时找不到对应的回调,就无法停止更新。
  • 如果你之前是临时创建Callback而没有保存实例,那现在必须修改代码,把Callback保存为类成员变量,这是解决问题的核心。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 07:39:22