有很多事情。GPS 可能来自所谓的“冷启动”,它不知道它在哪里。在这些情况下,最后一个已知位置为空。您也可能处于没有信号的位置以获取位置修复。它也可能是一个糟糕的 GPS 或一个糟糕的 GPS 驱动程序(咳嗽三星咳嗽)。这些东西都不准确。
首先,我将从这个文档开始。位置获取策略
接下来,让我们评估一下这里的逻辑。是的,GPS 已启用。但是,在这种情况下,启用意味着它已启用以供具有精细位置权限的应用程序使用。启用并不意味着它当前处于活动状态并正在获取位置。但有一个好消息!您可以创建监听器或订阅位置更新。
因此,正如其他人所提到的,请确保您在清单中设置了权限。我假设您这样做,否则您的应用程序可能会因getLastKnownLocation()
通话权限问题而崩溃并烧毁。
然后要接收位置更新,请查看LocationListener类。通过实现此接口,您可以使用locationManager.requestLocationUpdates()
从 GPS 注册位置更新。
使用您的代码(我假设一些事情,比如它在一个活动中,并且正在描述的方法在 UI 线程上调用):
public class MyActivity extends Activity implements LocationListener {
// The rest of the interface is not really relevant for the example
public void onProviderDisabled(String provider) { }
public void onProviderEnabled(String provider) { }
public void onStatusChanged(String provider, int status, Bundle extras) { }
// When a new location is available from the Location Provider,
// this method will be called.
public void onLocationChanged(Location location) {
// You should do whatever it was that required the location
doStuffWithLocation(location);
// AND for the sake of your users' battery stop listening for updates
(LocationManager) getSystemService(LOCATION_SERVICE).removeUpdates(this);
// and cleanup any UI views that were informing of the delay
dismissLoadingSpinner();
}
// Then in whatever code you have
public void methodA() {
LocationManager locationManager;
GeoPoint p;
locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);
boolean gps_enabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
if (gps_enabled) {
Location location = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
if (location == null) {
// When it is null, register for update notifications.
// run this on the UI Thread if need be
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, this);
// Since this might take some time you should give the user a sense
// that progress is being made, i.e. an indeterminate ProgressBar
showLoadingSpinner();
} else {
// Otherwise just use the location as you were about to
doStuffWithLocation(location);
}
}
...
这应该像您期望的那样运行您的代码,然后在 GPS 没有位置的情况下,您启动它并等待直到您获得位置。一旦发生这种情况,您将其关闭并按照您的计划使用它。这是一种幼稚的方法,但您应该能够将其用作简单的基础。真正的解决方案应该考虑没有机会获得位置的情况,处理位置提供程序不可用或在您等待位置时变得不可用的情况,并验证位置的健全性。