Accelerometer SensorEvent时间戳

Aja*_*ngh 23 android

我目前正在开发一个Android应用程序..我必须记录加速度计传感器事件坐标与事件时间.我得到了传感器事件时间戳,如"3497855005850",但我无法将事件时间戳转换为用户可读的日期时间格式.提前谢谢

如何将SensorEvent时间戳转换为unix时间戳?

eha*_*ell 35

传感器时间戳实际上是纳秒的正常运行时间,而非系统时间(以纳秒为单位).请参阅SensorEvent.timestamp到绝对(utc)时间戳?.

理论上,您可以使用以下方法将传感器时间戳转换为时间(以毫秒为单位):

long timeInMillis = (new Date()).getTime() 
                    + (sensorEvent.timestamp - System.nanoTime()) / 1000000L;
Run Code Online (Sandbox Code Playgroud)

您甚至可以(new Date()).getTime()通过两次System.nanoTime()调用来约束调用,并将它们平均以更接近实际偏移量.

然后,您可以将传感器时间格式化为日期和时间.

  • 从Android 4.2.1(API lvl 17)开始,在我的Nexus 4上,`sensorEvent.timestamp`似乎包含确切的时间戳(以纳秒为单位).这似乎是无证的,尽管它非常重要! (8认同)
  • 遗憾的是,时间戳的价值不依赖于Android的版本:https://code.google.com/p/android/issues/detail?id = 5661 (3认同)
  • 这是一个错误的答案。传感器时间戳可能不是以纳秒为单位的正常运行时间,它因制造商而异。 (2认同)

Bob*_* S. 5

您可以在函数中设置参考时间变量onSensorChanged(SensorEvent)

当前时间和事件时间的参考。当事件到达时,从事件时间中减去传感器参考时间,就会得到纳秒级的差异。您可以将该差值除以 1,000,000 添加到当前时间参考,以获得以毫秒为单位的事件时间。
对于一个事件,计算误差最多可达 0.5 毫秒。您可以通过偶尔更改参考时间来最大限度地减少错误。

private long sensorTimeReference = 0l;
private long myTimeReference = 0l;

public void onSensorChanged(SensorEvent event) {
    // set reference times
    if(sensorTimeReference == 0l && myTimeReference == 0l) {
        sensorTimeReference = event.timestamp;
        myTimeReference = System.currentTimeMillis();
    }
    // set event timestamp to current time in milliseconds
    event.timestamp = myTimeReference + 
        Math.round((event.timestamp - sensorTimeReference) / 1000000.0);
    // some code...
}
Run Code Online (Sandbox Code Playgroud)

  • 如何处理报告其值有延迟的传感器? (2认同)