如果用户没有激活 GPS,他仍然可以在手机设置中激活 Wifi/网络作为位置源,因此您也可以使用这些数据。
您始终可以通过以下方式获取 GPS 或网络的最后一个已知位置
locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
和/或
locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER)
它保存设备的最后一个已知位置,该位置可以来自您的应用程序或以前使用过 GPS 的任何其他应用程序。
您实际上可以使用两个具有不同提供程序的位置管理器:一个使用 GPS_PROVIDER,另一个使用 NETWORK_PROVIDER。Gps 更准确,但通常只在户外自由天空下工作,为什么 NETWORK_PROVIDER 在室内工作但不太准确。此外,GPS 可能需要一段时间才能在初始化后获得第一次修复(有时即一分钟或更长时间),而网络几乎可以立即获取位置。
您应该阅读这篇文章,它非常详细并且有示例代码:
在 Android 上获取用户当前位置的最简单、最可靠的方法是什么?
关于第二个问题:在停止服务之前,您还应该取消注册位置侦听器。您可以在 onPause 或 onDestroy 上执行此操作。
locationManager.removeUpdates(baseLocationListener)
或者
locationManager.removeAllUpdates()
我认为在你的情况下使用 getLastKnowLocation() 很好。
不过,如果您想明确了解 GPS 状态,您可以实现 GPS 状态侦听器,然后使用如下所示的内容,它会告诉您 GPS 是否有任何卫星定位 - 但如前所述,我不这么认为真的很有必要。
final class GpsStatusListener implements GpsStatus.Listener {
public void onGpsStatusChanged(int i) {
if (i==GpsStatus.GPS_EVENT_FIRST_FIX) {
Log.d(AskTingTing.APP, "gpsx.fixed.");
for (GpsSatellite sat:locationManager.getGpsStatus(null).getSatellites()) {
Log.d(AskTingTing.APP, "gpsx.GpsStatus.Sat.fixed: " + sat.usedInFix());
}
}
}
}
查看上面的链接以获得良好的代码示例。