这是我的GPSTracker构造函数类:
public GPSTracker(Context context) {
this.mContext = context;
locationManager = (LocationManager) mContext.getSystemService(LOCATION_SERVICE);
Location gpsLocation = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
Location networkLocation = locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
}gpsLocation和networkLocation总是空的。
getLastKnowLocation方法不返回任何位置..。即使我确信在午餐活动(并创建GPSTracker对象)之前的几秒钟,设备也有网络位置(在检查网络位置是否可用之后,我已经禁用了地理定位)
用Android在Nexus 5上进行测试
发布于 2016-04-20 18:20:12
是的,getLastKnownLocation()很可能返回null。文档说:
返回一个位置,该位置指示从给定提供程序获得的上一次已知位置修复的数据。 这可以在不启动提供程序的情况下完成。请注意,此位置可能已过时,例如,如果设备被关闭并移动到另一个位置。 如果当前禁用了提供程序,则返回null。
Android设备并不总是自动跟踪其位置。只有当某个应用程序请求了该位置时,“最后一个已知位置”才可用。因此,您不应该总是期望通过getLastKnownLocation()获得一个位置。而且,即使它返回了一些东西,位置也可能不是最新的。Location对象具有时间戳,您可以使用getTime()方法读取时间戳,也可以使用getAccuracy()方法读取估计的精度。这些可以用来计算的位置是可用的。
如果收到null或非常旧的位置,则需要请求一个新的位置。基本选项只是请求单个位置更新或具有您可以指定的时间间隔的连续更新。
在这两种情况下,类都需要实现LocationListener接口:
public class GpsTracker implements LocationListener {
// ...other code goes here...
@Override
public void onLocationChanged(Location location) {
// Do something with 'location' here.
}
}对于单个位置更新,您可以调用LocationManager.requestSingleUpdate()和连续更新LocationManager.requestLocationUpdates()。在任何一种情况下,都会有一个较小(或不太小)的延迟,并且当位置可用时将调用LocationListener.onLocationChanged()回调。
例如,您可以向GPS提供程序请求一个更新,如下所示:
locationManager.requestSingleUpdate(LocationManager.GPS_PROVIDER, this, null);全球定位系统提供商最大限度的持续更新。每隔1秒,并且只有当位置改变至少1米时,您才可以调用:
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000, 1, this);此外,还有一些requestSingleUpdate()的变体,您可以在文档中看到,而另一方面,Google服务定位API,但我们不去那里。您的问题是关于getLastKnownLocation()返回null和堆栈溢出,有几个不同的请求最新位置的方法的例子。
编辑:,这是一个古老的答案。基本思想仍然有效,但请查看Android文档,了解请求位置更新的现代方法。
https://stackoverflow.com/questions/36747349
复制相似问题