GPS查找和用户偏好

时间:2010-08-06 19:04:23

标签: android gps locationmanager

我开始将我的脚趾浸入LocationManager。我创建了一个跟踪GPS位置(间隔超过60000毫秒)的服务,并使用用户位置更新我的应用程序,以便他们可以找到附近的东西。

根据我的理解,用户可以进入他们的偏好并为特定应用禁用GPS。

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

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

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

2 个答案:

答案 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值。

方面问题:我不确定我认为如果它还在运行你需要销毁它。