是的,getLastKnownLocation() 很可能返回 null。 documentation 说:
返回一个 Location 指示来自最后一个已知位置的数据
从给定的提供程序获得的修复。
这可以在不启动提供程序的情况下完成。请注意,这
位置可能已过时,例如,如果设备已转动
关闭并移动到另一个位置。
如果提供者当前被禁用,则返回 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()](http://developer.android.com/reference/android/location/LocationManager.html#requestSingleUpdate(java.lang.String, android.location.LocationListener, android.os.Looper)) 和持续更新 [LocationManager.requestLocationUpdates()](@987654324 @、long、float、android.location.LocationListener))。在任何一种情况下,都会有一个很小(或不是那么小)的延迟,并且当位置可用时会调用 LocationListener.onLocationChanged() 回调。
例如,您可以像这样向 GPS 提供商请求一次更新:
locationManager.requestSingleUpdate(LocationManager.GPS_PROVIDER, this, null);
对于来自 GPS 提供商的持续更新,最大值。每隔 1 秒,并且只有在位置变化至少 1 米时,您才可以调用:
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000, 1, this);
还有更多requestSingleUpdate() 的变体,您可以在文档中看到,另一方面是 Google Play 服务位置 API,但我们不要去那里。您的问题是关于 getLastKnownLocation() 返回 null 并且 Stack Overflow 有几个不同方式请求最新位置的示例。
编辑:这是一个旧答案。基本想法仍然有效,但请查看 Android 文档以了解请求位置更新的现代方式。