Accelerometer SensorEvent метка времени
В настоящее время я работаю над андроидным приложением. Мне нужно зарегистрировать координату события датчика акселерометра с временем события. Я получил отметку времени события датчика как "3497855005850", но я не могу преобразовать временную метку события в формат времени, пригодный для чтения. Спасибо заранее
Как преобразовать временную метку SensorEvent в timestamp unix?
Ответы
Ответ 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. , разница правильна при инициализации. Однако правильное время и время измерений расходятся. Расчетное время измерений будет в будущем.