我开始将我的脚趾浸入LocationManager。我创建了一个跟踪GPS位置(间隔超过60000毫秒)的服务,并使用用户位置更新我的应用程序,以便他们可以找到附近的东西。
根据我的理解,用户可以进入他们的偏好并为特定应用禁用GPS。
我基本上想为我的用户提供两种模式。 1)GPS。 2)如果 GPS无法拉动,设备没有GPS芯片,或GPS已关闭我的应用程序,我想允许他们输入他们的邮政编码(或者可能切换到手机塔查询)。
粗体文字是我感兴趣的。如何判断设备是否没有GPS?如何判断用户是否已为我的应用程序禁用了GPS?
附带问题:我的服务是从我的第二个活动启动的。我在此Activity的onDestroy方法中调用stopService。如果我回到第一个活动并且第二个活动被销毁,我仍然会注意到手机上的GPS图标正在运行。停止服务是否足够?或者我是否需要在服务的onDestroy中停止LocationManager?
答案 0 :(得分:3)
如果用户没有激活GPS,他仍然可以在手机设置中激活Wifi /网络作为位置信号源,因此您也可以使用这些数据。
您始终可以通过
获取GPS或网络的最后已知位置locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
和/或
locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER)
它包含设备的最后一个已知位置,可以来自您的应用或之前使用过GPS的任何其他应用。
您实际上可以使用具有不同提供商的两个位置管理器:一个使用GPS_PROVIDER,另一个使用NETWORK_PROVIDER。 Gps更准确但通常只能在自由天空下在室外工作,为什么NETWORK_PROVIDER在室内工作但不太准确。此外,GPS可能需要一段时间才能在初始化后获得第一次修复(有时即一分钟或更长时间),而网络几乎立即获得该位置。
你应该阅读这篇文章,它非常详细,并有示例代码: What is the simplest and most robust way to get the user's current location on 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());
}
}
}
}
请查看上面的链接以获取一个好的代码示例。
答案 1 :(得分:1)
如果设备没有GPS或它不可用,位置管理器返回的值(lat,lng)将等于null
,因此只需检查值,然后提示用户输入其位置。我建议使用反向地理编码来获取该实例中其位置的lat / lng值。
方面问题:我不确定我认为如果它还在运行你需要销毁它。