java - 如何使用 Android 获得最准确的时间?

标签 java android clock

我真的不认为这个问题是重复的。
大多数类似问题的答案都说使用 System.currentTimeMillis() 作为最准确的时间,但我注意到两个并排的 Android 设备可能彼此相差 5 秒或更长时间,或者(更重要的是)实时时间,我相信 currentTimeMillis() 会反射(reflect)这种差异。

所以我真正需要的是一个全面的解决方案,以便在给定时刻获得最准确的时间。
例如,它将从 GPS 开始,如果 GPS 不可用或没有信号,则回退到 SNTP,或者如果这不起作用,则要求 Android 通过其自己的 SNTP 或运营商 NITZ 刷新其挂钟。

我的目标是在 .1 秒内准确。
这可能吗?
谢谢。

最佳答案

Is that possible?

这取决于您对“那个”的定义。

那么,让我们先检查一下您的其余 Material ...

it would start with the GPS

GPS times are not especially accurate depending on hardware .我认为您还需要使用 NmeaListener尝试直接从 NMEA 句子中解析时间数据,如 AFAIK getTime()Location是系统时间,不是一些GPS时间。此外,请记住 GPS 访问并非普遍适用(用户可能已专门禁用它,用户可能已将设备置于飞行模式,用户可能在没有可用 GPS 信号的大型建筑物中)。

fall back to SNTP

有很多 SNTP 客户端代码位可供您尝试。请记住,互联网连接不是普遍的(设备可能在任何已知接入点之外仅支持 WiFi,用户可能已将设备设置为飞行模式,设备可能支持移动数据但在当前位置没有信号强度)。

if that doesn't work ask Android to refresh its wall clock with via its own SNTP or carrier NITZ

可以想象,root 设备可能能够以某种方式执行此操作,但 Android SDK 中没有任何内容可让普通应用程序强制进行此类刷新。请记住,连通性并不普遍(请参阅上一段中的花名册)。

所以,回到:

Is that possible?

如果“那个”是保证在所有情况下都有效的解决方案,那么不,这是不可能的,因为我们无法保证您能够与任何时间源进行通信。

如果“那个”是一种在设备具有互联网连接的情况下保证有效的解决方案,那么您需要询问您的 SNTP 客户端库实现者他们是否可以达到 100 毫秒的精度。除了连接问题,SNTP 是唯一完全在您控制之下的策略,因为 GPS 可能不准确,NITZ 不是您自己管理的东西。

关于java - 如何使用 Android 获得最准确的时间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21759456/

相关文章:

java - 将@JmsListener 与多个负载类型一起用于同一目的地?

Java "Error occurred during initialization of VM"修复了吗?

java - 为什么我的 MYSQL 不能用 java 运行?

android - 在单独的 Activity 中显示绘制的 AChartEngine 图

javascript - 智能手机浏览器中的 ACE 编辑器

c++ - 在 SFML 中,时钟有限制吗?

java - 在 00 :00 format? 中创建一个以秒为单位的递增计时器

java - Spring-Data for MongoDB 异常,同时使用@DBRef 注释进行引用

android - 设置抽屉 View 宽度以在 DrawerLayout 中包裹内容

linux - 为什么时钟是: can't known any way access to the hardware clock.?