6

我的应用程序使用 LocationListener 来跟踪当前位置。只要 GPS 提供商提供定期修复,它就可以正常工作。但是,我希望我的应用程序在位置不再可靠时提醒用户,因为修复不再是最新的。因此,我使用 timeCheckHandler 每隔几秒调用一次 getLastKnownLocation。

我的问题是,即使经常收到准确的修复,通过将 getTime() 应用于 getLastKnownLocation 返回的位置返回的时间通常比 System.currentTimeMillis() 返回的当前时间早,通常大约 20 秒。

我通过向 onLocationChanged(arg0) 添加代码以记录修复时间 (arg0.getTime()) 和当前时间 (System.currentTimeMillis()) 进一步调查了该问题。我再次看到大约 20 秒的差异。

目前代码如下:

    public void onLocationChanged(Location arg0) {
    mapview.handleLocationChanged(mapview, arg0.getLatitude(), arg0.getLongitude(), arg0.getBearing(), arg0.getAccuracy(), "GPS fix");
    addDebugNote("Fix received at time: "+Long.toString(arg0.getTime()/1000)+" Now: "+Long.toString((System.currentTimeMillis())/1000));
}

我的调试文件的典型输出为:

Fix received at time: 1292091908 Now: 1292091928

为什么我会看到修复时间和当前系统时间之间的这种差异?

我必须接受大约 20 秒的差异是正常的吗?

4

2 回答 2

20

GPS 定位时间独立于您的网络提供商时间/设备时间。System.currentTimeMillis() 将为您提供设备上设置的设备时间。

如果您想知道这一点有多近,您可以:

  1. 在应用程序开始时同步代码中的时间(GPS 和设备),方法是在您获得第一次 GPS 位置更新后立即获取两者之间的差异。在那个即时查询设备时间,看看两者有什么区别。将此差异保存在变量中。

  2. 将其用作后续位置更新中的校正因子,以根据您需要的参考系了解准确时间。(设备时间或 GPS)

我还发现,使用 NETWORK 作为位置提供者,您可能只能获得设备时间。因此,如果您同时监听来自(GPS 和网络)的更新,您可能还需要使用 location_obj.getProvider() 来区分这一点并过滤掉 GPS 提供程序。

于 2010-12-19T04:57:55.697 回答
1

今天重复测试,发现GPS时间和系统时间相差22秒。这个问题在网络上的其他地方讨论过,似乎 GPS 时间和手机的系统时间之间存在差异是正常的(在我的情况下,它设置为从网络自动更新。)一个因素是 GPS时间与 UTC 时间大约相差 15 或 17 秒(取决于哪个来源是正确的)......它不同步,因为 GPS 时间自 1980 年以来一直没有更新为周期性的“闰秒”。

考虑到这一点,我认为我需要检查最新修复的最新情况的答案是将当前系统时间与最新修复的系统时间(不是 GPS 时间)进行比较。

于 2010-12-12T14:46:36.933 回答