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
相关产品推荐
相关产品推荐

