0

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

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

我基本上想为我的用户提供两种模式。1)全球定位系统。2)如果GPS 无法拉动,设备没有 GPS 芯片,或者我的应用程序关闭了 GPS,我想让他们输入他们的邮政编码(或者可能切换到手机信号塔查找)。

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

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

4

2 回答 2

3

如果用户没有激活 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());
            }
        }
    }
}

查看上面的链接以获得良好的代码示例。

于 2010-08-06T19:32:17.333 回答
1

如果设备没有 GPS 或不可用,则位置管理器返回的值 (lat,lng) 将等于,null因此只需检查这些值,然后提示用户输入他们的位置。我建议使用反向地理编码来获取他们在该实例中的位置的 lat/lng 值。

附带问题:我不确定如果它仍在运行,我认为你需要销毁它。

于 2010-08-06T19:08:21.610 回答