Tal*_*nel 15 android nanotime android-sensors
我的应用程序使用android 4.4.X中引入的步进检测器传感器API在后台步骤计数中执行.
我的应用程序必须知道每个步骤事件产生的确切时间(至少准确度为一秒).
因为我执行传感器批处理,所以onSensorChanged(SensorEvent event)调用的时间与步骤事件发生的时间不同 - 我必须使用该event.timestamp字段来获取事件时间.
有关此字段的文档是:
事件发生的纳秒时间
问题:
在某些设备(例如Moto X 2013)中,这个时间戳似乎是自启动以来的纳秒时间,而在某些设备(例如Nexus 5)中,它实际上以纳秒为单位返回通用系统时间System.currentTimeMills() / 1000.
据我所知,关于这一点已经存在一个陈旧的问题,但是由于引入了传感器批处理 - 使用该字段来了解事件时间变得非常重要,并且不可能再依赖于System.currentTimeMills()
我的问题:
我该怎么做才能在所有设备上始终以系统毫秒为单位获取事件时间?
而不是你的"2天"比较,你可以检查是否event.timestamp小于例如1262304000000000000- 如果过去设置了用户的时钟,或者他们的手机已经运行了40年,那么你只会遇到问题. .
除了对这个问题的评论表明有时它甚至是毫秒而不是纳秒.其他评论表明应用了偏移,在这种情况下,它不会是系统时间或基于正常运行时间.
如果你真的必须准确,我唯一能看到的方法是首先捕获一个事件(或两个,用于比较),max_report_latency_ns设置为0(即非批量)并将时间戳与系统时间和/或进行比较elapsedRealtime.然后使用该比较来计算偏移量(并可能决定是否需要补偿毫秒与纳秒之间的关系)并将该偏移量用于批处理事件.
例如,抓住几个事件,最好相隔几秒钟,记录System.currentTimeMillis()每次,然后执行以下操作:
long timestampDelta = event2.timestamp - event1.timestamp;
long sysTimeDelta = sysTimeMillis2 - sysTimeMillis1;
long divisor; // to get from timestamp to milliseconds
long offset; // to get from event milliseconds to system milliseconds
if (timestampDelta/sysTimeDelta > 1000) { // in reality ~1 vs ~1,000,000
// timestamps are in nanoseconds
divisor = 1000000;
} else {
// timestamps are in milliseconds
divisor = 1;
}
offset = sysTimeMillis1 - (event1.timestamp / divisor);
Run Code Online (Sandbox Code Playgroud)
然后为你的批量活动
long eventTimeMillis = (event.timestamp / divisor) + offset;
Run Code Online (Sandbox Code Playgroud)
最后一点需要注意 - 即使你做了所有这些,如果在捕获过程中系统时间发生变化,也可能会影响你的时间戳.祝好运!
| 归档时间: |
|
| 查看次数: |
3503 次 |
| 最近记录: |