android - inventor - Sensor de acelerĂ³metro
acelerometro app inventor (5)
Actualmente estoy trabajando en una aplicación de Android. Tengo que registrar la coordenada de eventos del sensor del acelerómetro con el tiempo del evento. Obtuve la marca de tiempo del evento del sensor como "3497855005850" pero no puedo convertir la marca de tiempo del evento en un formato de fecha y hora legible por el usuario.
¿Cómo puedo convertir la marca de tiempo SensorEvent en la marca de tiempo de Unix?
La marca de tiempo del sensor es en realidad nanosegundos de tiempo de actividad, no tiempo de sistema en nanosegundos. Ver SensorEvent.timestamp to absolute (utc) timestamp? .
En teoría, puede convertir la marca de tiempo del sensor en tiempo en milisegundos usando:
long timeInMillis = (new Date()).getTime()
+ (sensorEvent.timestamp - System.nanoTime()) / 1000000L;
Incluso podría poner entre la llamada (new Date()).getTime()
con dos llamadas System.nanoTime()
y promediarlas para acercarse al desplazamiento real.
Luego puede formatear la hora del sensor como fecha y hora.
Puede configurar las variables de tiempo de referencia en su función onSensorChanged(SensorEvent)
.
Referencia para la hora actual y la hora del evento. Cuando llegue el evento, reste el tiempo de referencia del sensor del tiempo del evento y tendrá una diferencia en nanosegundos. Puede agregar esa diferencia dividida por 1,000,000 a la referencia de tiempo actual para obtener el tiempo del evento en milisegundos.
El error al calcular esto puede ser de 0,5 milisegundos como máximo para un evento. Puede minimizar el error cambiando los tiempos de referencia de vez en cuando.
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...
}
Tuve el mismo problema y utilicé la solution de ehartwell. Sin embargo, utilicé System.currentTimeMillis()
lugar de la new Date().getTime()
.
Además, encontré que hay un desplazamiento de sensorEvent.timeStamp
y System.nanoTime()
de 300 ms como máximo, en su mayoría <200 ms. Dependiendo de la precisión necesaria puede ignorar esta diferencia.
Si utilizo la solution Boban S., la diferencia es correcta en la inicialización. Sin embargo, la hora correcta y la hora de las mediciones divergen. El tiempo estimado de las mediciones es en el futuro.
Varía para cada dispositivo. Podría basarse en la época, el tiempo desde el inicio y el tiempo de activación de la CPU. El mejor enfoque es leer los tres, luego ver cuál es la marca de tiempo más cercana, y luego convertir en base al desplazamiento.
Veo tres maneras de obtener millis (Kotlin)
val millis = Date().getTime() + (event.timestamp - System.nanoTime()) / 1000000L
val millis = System.currentTimeMillis() + (event.timestamp - System.nanoTime()) / 1000000L
val millis = System.currentTimeMillis() + (event.timestamp - SystemClock.elapsedRealtimeNanos()) / 1000000L
los tres entregan el mismo resultado, pero cuando quiero ver la diferencia entre el valor calculado y la hora actual
val diff = System.currentTimeMillis() - millis
Veo ''diff'' con valor -359704905 ?
Log.d("diff", "" + event.timestamp + " - " + System.nanoTime())
dif: 541695268300000 - 181990403666592
dif: 541695277240000 - 181990405818592
dif: 541695286859000 - 181990411901592
dif: 541695296139000 - 181990412584592
dif: 541695305735000 - 181990415222592
Así que todas las soluciones sugeridas no son correctas
Para mí, esta manera simple se ajusta a mis necesidades.
override fun onSensorChanged(sensorEvent: SensorEvent?) {
val millis = System.currentTimeMillis()
}