Подтвердить что ты не робот

Accelerometer SensorEvent метка времени

В настоящее время я работаю над андроидным приложением. Мне нужно зарегистрировать координату события датчика акселерометра с временем события. Я получил отметку времени события датчика как "3497855005850", но я не могу преобразовать временную метку события в формат времени, пригодный для чтения. Спасибо заранее

Как преобразовать временную метку SensorEvent в timestamp unix?

4b9b3361

Ответ 1

Временная метка датчика - фактически наносекунды времени безотказной работы, не системного времени в наносекундах. См. SensorEvent.timestamp в абсолютную (utc) временную метку?.

В теории вы можете преобразовать временную метку датчика во времени в миллисекундах, используя:

long timeInMillis = (new Date()).getTime() 
                    + (sensorEvent.timestamp - System.nanoTime()) / 1000000L;

Вы можете даже скопировать вызов (new Date()).getTime() двумя вызовами System.nanoTime() и усреднить их, чтобы приблизиться к фактическому смещению.

Затем вы можете отформатировать время датчика как дату и время.

Ответ 2

Вы можете установить переменные времени референта в своей функции 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...
}

Ответ 3

У меня была та же проблема, и я использовал ehartwell . Однако я использовал System.currentTimeMillis() вместо new Date().getTime().

Кроме того, я обнаружил, что существует смещение sensorEvent.timeStamp и System.nanoTime() максимального 300 мс, в основном < 200 мс. В зависимости от необходимой точности вы можете игнорировать эту разницу.

Если я использую решение Boban S. , разница правильна при инициализации. Однако правильное время и время измерений расходятся. Расчетное время измерений будет в будущем.