2010-08-06 74 views
0

我开始将我的脚趾蘸入LocationManager中。我创建了一个跟踪GPS位置的服务(间隔超过60000ms),并使用用户位置更新我的应用程序,以便他们可以在附近找到东西。GPS查询和用户首选项

据我所知,用户可以进入他们的偏好,并禁用特定应用程序的GPS。

我基本上想为我的用户提供两种模式。 1)GPS。 2)如果GPS不能拉,设备没有GPS芯片,或GPS关闭我的应用程序,我想让他们键入他们的邮政编码(或可能切换到手机塔查找)。

粗体文本是我感兴趣的。如何判断设备是否没有GPS?我如何判断用户是否禁用了我的应用程序的GPS?

侧面问题:我的服务从我的第二个活动启动。我在本Activity的onDestroy方法中调用stopService。如果我备份到第一个活动并且第二个活动被破坏,我仍然注意到手机上的GPS图标正在运行。停止服务是否足够?或者,我是否需要在服务的onDestroy中停止LocationManager?

回答

3

如果用户没有激活GPS,他仍然可以在手机设置中将Wifi /网络作为位置源激活,因此您也可以使用这些数据。

你总是可以通过

locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER); 

和/或

locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER) 

它会保存在设备的最后已知位置,这可以从获得GPS或网络的最后已知位置应用程序或以前使用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()); 
      } 
     } 
    } 
} 

查看上面的链接,获取一个好的代码示例。

+0

谢谢你的反应,我想我的服务提供商也跟踪NETWORK_PROVIDER(这将使用手机信号塔,是吗?),如果GPS没有返回值(室内需要预先),我会使用这些数据。 – Andrew 2010-08-06 19:36:21

+0

是的,网络使用手机信号塔或IP地址或两者兼而有之。请参阅此链接了解详细说明:http://forum.sdx-developers.com/android-2-1-development/cdma-lockup-wifi-use-wireless-networks-and -gps!/ msg22834 /#msg22834“使用无线网络=这只是指出固定小区站点的经纬度,它基于小区站点T1的IP地址。它只使用一个站点,即您当前所在的站点,这就是您在地图上看到的,而不是您的位置,而是您所在的手机站点。“我建议同时使用GPS和网络提供商 – 2010-08-06 19:39:26

+0

“我的服务提供商还跟踪NETWORK_PROVIDER”:它不依赖于您的网络提供商,他们总是跟踪位置。关于手机用户是否已在设置/位置和安全性下激活了它 – 2010-08-06 19:40:28

1

如果设备没有GPS或它不可用,位置管理器返回的值(lat,lng)将等于null,因此只需检查这些值,然后提示用户输入其位置。在这种情况下,我建议使用反向地理编码来获取其位置的纬度/经度值。

旁边的问题:我不太确定我假设你需要摧毁它,如果它仍在运行。

+0

感谢您的回复。 “位置管理器返回的值(lat,lng)将等于null)你的意思是在onLocationChanged处理程序中?在使用反向地理编码之前,你不建议尝试使用基于单元塔的位置? – Andrew 2010-08-06 19:22:42