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

Android LocationProvider无法持续更新位置,是否需放入循环?

搞定定位持续更新的问题

嘿,我帮你排查了代码里的问题,完全不需要把mLocationProvider放进循环里,问题出在两个关键细节上:

1. 你没启动定位服务连接

看你的MainActivity,只是初始化了mLocationProvider,但从来没调用它的connect()方法!这就像你买了个路由器,插了电但没按开机键,当然没法用啦。

2. 定位成功后的逻辑有漏洞

在LocationProvider的onConnected方法里,你只在getLastLocation()返回null的时候才请求持续更新,一旦拿到历史位置就直接回调一次,然后就没下文了——这就是为什么只加载一次的原因。


直接上修改方案:

第一步:给MainActivity加上连接和断开逻辑

在onCreate里启动连接,还要在Activity销毁时断开,避免内存泄漏:

public class MainActivity extends AppCompatActivity implements LocationProvider.LocationCallback { 
    private LocationProvider mLocationProvider; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 
        setContentView(R.layout.activity_main); 
        mLocationProvider = new LocationProvider(this, this);
        // 关键:启动定位服务连接
        mLocationProvider.connect();
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        // 关键:销毁时断开连接,释放资源
        mLocationProvider.disconnect();
    }

    @Override
    public void handleNewLocation(Location location) { 
        double currentLatitude = location.getLatitude(); 
        double currentLongitude = location.getLongitude(); 
        float currentAccuracy = location.getAccuracy(); 
        // 加个日志,方便你看是不是在持续更新
        Log.d("MainActivity", "新位置:" + currentLatitude + ", " + currentLongitude);
    } 
}

第二步:修正LocationProvider的onConnected方法

不管有没有拿到历史位置,都要请求持续的位置更新,这样既能拿到初始位置,也能实时获取新位置:

@Override 
public void onConnected(Bundle bundle) { 
    Log.i(TAG, "Location services connected."); 
    if (ActivityCompat.checkSelfPermission(mContext, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(mContext, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { 
        Toast.makeText(mContext, "Permission missing", Toast.LENGTH_LONG).show(); 
        return; 
    } 
    Location location = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient); 
    if (location != null) { 
        // 先把历史位置回调出去
        mLocationCallback.handleNewLocation(location); 
    }
    // 重点:不管有没有历史位置,都开启持续更新
    LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, this); 
}

第三步:补全缺失的onLocationChanged方法

你的LocationProvider代码里只写了@Over,明显没写完这个方法,这是接收新位置的关键回调:

@Override
public void onLocationChanged(Location location) {
    // 每次获取到新位置,就回调给MainActivity
    mLocationCallback.handleNewLocation(location);
}

额外提醒:

  • 你设置的setInterval(10*1000)和setFastestInterval(1*1000)是没问题的,前者是期望的更新间隔,后者是系统允许的最快更新频率。
  • 如果你的应用跑在Android 6.0及以上,一定要记得动态申请定位权限,不然定位服务会直接失效哦。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 06:41:58