通过GPS时间同步Android设备?

简洁版本:

问题:我需要几个Android设备在同一时间做一些事情(在大约100毫秒内)。 例如,我希望所有设备在以前确定的时间点播放一定的声音。

问题:我可以使用GPS时间来确保设备时钟同步吗?

更长的版本:

有几个Android设备的人在相同的户外位置(对于某些特定的体育赛事)。 所有的设备应该在同一时间发出某些事件的信号。 (什么时候才能确定,只要他们在同一时间做,那么他们在那个时候做什么并不重要)。 FWIW:这些活动将同时帮助人们开展体育活动。

这里是我可以做的假设:

  • 有或没有小区覆盖。 (在户外,可能远在城市地区)
  • 这些设备可能会或可能不会连接到互联网。 (有些人可能没有数据计划)
  • 设备可以相互交谈。 如果设备没有连接到互联网,他们将通过WiFi连接(虽然WiFi可能没有互联网网关)。
  • 设备在室外(而不在build筑物内)。 (这很好,这意味着所有设备都可以获得GPS定位)
  • 这些设备在物理上彼此接近(即在300平方米以内)。 (不知道这是否重要)

我无法使用内部时钟来了解何时播放事件:用户可以手动更改时间,即使设备设置为从蜂窝networking获取时间,该networking也可能无法提供准确的时间。 两个设备可能被预订到不同的networking,因此他们的时间可能不会很好地同步。

在应用程序启动时,每个设备都可以要求GPS定位并保存GPS时间与其内部时钟之间的差异。 现在主人可以根据这个GPS时间来宣布事件(通过使用它的内部时钟并减去它之前保存的偏移量)。

这是否足够准确和可靠?

非常感谢,Andreas Leitner

Related of "通过GPS时间同步Android设备?"

您可以在onLocationChanged()callback中获取与currentTimeMillis()Location.getTime()的时间差(以毫秒为单位onLocationChanged() 。 使用requestSingleUpdate()


我只想补充说,如果用户有一个数据连接,他们可以使用NTP时间,这是更准确的,因为GPS内部时钟可能会漂移,纠正它需要一段时间。


编辑:我想编辑这个答案。 在担任Android操作系统中的GNSS开发人员之后,我意识到许多“主要”Android OEM已经搞砸了。 通常NMEA语句是在芯片组或GNSS堆栈中生成的。 有时候是对的,这取决于实施。

还有一个闰秒的问题。 GPS时间不是UTC时间。 截至本文写作时间是18秒 。

此外,根据文档, Location对象中的GPS时间现在是系统时间

TLDR:使用NTP时间

您不能完全依赖GPS时间,因为某些设备存在已知问题,某些设备的检索时间提前了一天。 在这种情况下,你可能会得到很大的抵消。

http://code.google.com/p/android/issues/detail?id=23937

解决这个问题的解决方法已经在这里讨论: Android:三星Galaxy Tabs和Android 2.2设备显示GPSdate从2012年1月1日前进1天

UTC不是从GPS派生的,APK会覆盖GPS。 Android设置忽略GPS时钟。 你是getTime()是NIST。 不是GPS