安卓问题:如何查找最近一次GPS定位的时间

6
我的应用程序使用LocationListener来跟踪当前位置。只要GPS提供者提供定期修复,这就很好地运作。然而,如果位置不再可靠,因为修复不再是当前的,我希望我的应用程序会向用户发出警报。因此,我使用timeCheckHandler每隔几秒钟调用getLastKnownLocation。
我的问题是,即使经常接收到准确的修复,将getLastKnownLocation返回的位置应用getTime()返回的时间通常比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));
}

我的 Debug 文件的典型输出如下:
Fix received at time: 1292091908 Now: 1292091928

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

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


我遇到了同样的问题,我在onLocationChanged(Location arg0)方法的第一行添加了arg0.setTime( System.currentTimeMillis() );来“修正”时间戳。我不确定这样做是否会在以后产生任何副作用。 - ApollonDigital
2个回答

20

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

如果您想知道点有多新,可以:

  1. 在应用程序启动时通过在获得第一个GPS位置更新时取两者之间的差异来同步代码中的两个时间(GPS和设备) 。在那一瞬间查询设备时间并查看两者之间的差异。将此差异保存在变量中。

  2. 将此作为修正因子在后续位置更新中使用,以根据您需要的参考框架(设备时间或GPS)知道确切的时间。

另外我发现使用NETWORK作为位置提供者可能仅获取设备时间。因此,如果您正在同时监听(GPS和网络)的更新,则还需要使用location_obj.getProvider()进行区分并过滤GPS提供者。


1
谢谢。这非常有帮助。(我想GPS时间必须非常准确才能与如此精度一起工作。我想知道为什么手机网络不直接与其同步。) - prepbgg
好点子,也许网络比GPS更容易连接?无论如何,如果您的手机将时间同步到GPS,当我们尝试获取时间时,我们会遇到一个错误的网络时间吗?因此,基本上我们必须在使用网络进行位置更新时同步计时器。 - Goku

1
重复测试后,我发现GPS时间和系统时间之间的差异为22秒。这个问题在网上别处已经讨论过了,似乎GPS时间和手机系统时间之间存在差异是正常的(我的情况是自动从网络更新)。一个因素是GPS时间与UTC时间相差约15或17秒(取决于哪个来源是正确的)...它失步了,因为自1980年以来GPS时间没有更新定期的“闰秒”。
记住这一点,我认为检查最新修复的当前性将是将当前系统时间与最新修复的系统时间(而不是GPS时间)进行比较的答案。

重新阅读Android位置参考文档,我想起getTime()返回修复的UTC时间,我认为我可以依赖它的准确性。因此,手机系统时间不准确。在网上进一步阅读后,我发现手机时钟通常会偏离同步多秒钟。 - prepbgg
是的:有一篇来自2012年的ZDNet文章指出,当时安卓设备没有考虑到自1970年以来添加的15个闰秒,而GPS应该是准确的。 - FrankKrumnow

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接