Android问题找出最近的最新GPS修复方法

时间:2010-12-11 18:50:36

标签: android time gps gps-time

我的应用使用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));
}

和我的Debug文件的典型输出读取:

Fix received at time: 1292091908 Now: 1292091928

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

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

2 个答案:

答案 0 :(得分:20)

GPS定位时间与网络提供商的时间/设备时间无关。 System.currentTimeMillis()将为您设备设置设备时间。

如果你想了解最近的观点,你可以:

  1. 在应用程序启动时同步代码中的两个时间(GPS和设备),只要获得第一次GPS位置更新,就可以获取两者之间的差异。在那个即时查询设备时间,看看两者有什么区别。将此差异保存在变量中。

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

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

答案 1 :(得分:1)

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

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