java 如何显示从sensorevent的确切时间,时间戳为Android?

rsaldnfx  于 2023-02-07  发布在  Java
关注(0)|答案(2)|浏览(156)

我想显示第一步被检测到的时间。但是应用程序总是显示1970年1月1日。有人会检查什么是错误的,如何改变它吗?下面是我的代码:

public void run() {
    SensorManager mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
    Sensor mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_STEP_DETECTOR);

    mSensorManager.registerListener(new SensorEventListener() {
        @Override
        public void onSensorChanged(SensorEvent sensorEvent) {
            long timeStamp = sensorEvent.timestamp / 1000000;
            textView_moveTime.setText(DateUtils.getRelativeTimeSpanString(timeStamp));
        }

        @Override
        public void onAccuracyChanged(Sensor sensor, int i) {

        }
    }, mSensor, mSensorManager.SENSOR_DELAY_FASTEST);
}
2ic8powd

2ic8powd1#

SensorEvent报告系统 Boot 后的时间(包括休眠时间)(单位为纳秒)。要将其转换为绝对时间(单位为纳秒),请使用以下公式:

(DateTime.now().getMillis() - SystemClock.elapsedRealtime()) * 1000000
                + sensorEvent.timestamp
zy1mlcev

zy1mlcev2#

SensorEvent.timestamp是事件发生的时间,但它是自启动以来经过的时间。它不是事件发生的确切时间戳。我们希望从事件发生以来经过的时间中获得事件发生的实际时间。
参考:www.example.comhttps://developer.android.com/reference/android/hardware/SensorEvent#timestamp
1.我们需要将所有实体放在一个类似的单元中,这里我们使用Millis
1.我们有三个实体要使用。a)System.currentTimeMillis() b)SystemClock.elapsedRealtime()和c)SensorEvent.timestamp

1.如果我们使用SystemClock.elapsedRealtimeNanos(),那么我们需要将其转换为Millis,如下所示:

val systemCurrentTimeMillis = System.currentTimeMillis()
val systemClockElapsedRealtimeMillis = TimeUnit.NANOSECONDS.toMillis(SystemClock.elapsedRealtimeNanos())
val sensorEventTimeStampMillis = TimeUnit.NANOSECONDS.toMillis(sensorEvent.timestamp)

1.我们需要找出systemCurrentTimeMillissystemClockElapsedRealtimeMillis之间的差异,如下所示:

val currentMinusElapsedRealtimeMillis = systemCurrentTimeMillis - systemClockElapsedRealtimeMillis

1.找到差异后,我们需要添加sensorEventTimeStampMillis,如下所示:



val actualEventTimeMillis = currentMinusElapsedRealtimeMillis + sensorEventTimeStampMillis

1.然后,我们需要将结果转换为UTC,如下所示(我使用Joda Time):

val actualEventTimeUtc = DateTime(actualEventTimeMillis, DateTimeZone.UTC)

actualEventTimeUtc是事件发生的绝对时间。

    • 另一种理解是**

假设传感器在onSensorChanged.中报告了一个事件,我们发现当前时间为:换句话说,报告时间是下午13点,而不是实际事件发生的时间。
SystemClock.elapsedRealtime()表示它在过去30小时内一直在运行。换句话说,它在当前时间的30小时前启动。
因此,我们从当前时间减去30小时,得到传感器启动的时间,因此,我们得到前一天的上午7点。
SensorEvent.timestamp表示事件发生在SystemClock.elapsedRealtime(). 28小时之后
因此,我们在前一天上午7点的基础上加上28小时,得到当天上午11点,这就是事件发生的实际时间。

相关问题