Constante de fecha y hora de Android SensorEvent

Actualmente estoy escribiendo una simple aplicación Android para calcular los sesgos de los dispositivos imu. Al hacer esto me he encontrado con un problema con el valor de event.timestamp

Usando el código:

float dT = (event.timestamp-accel_timestamp)*NS2S; 

Del ejemplo de la Guía de referencia de Android para calcular la matriz de rotación a partir del cuaternión.

Cuando ejecuto el código usando un Galaxy Nexus-S obtengo un dT de 0.06 ~ 0.07 seg entre mediciones pero cuando ejecuto el mismo código en un Nexus 4 de LG o Nexus 7 el dT es siempre 0. Estoy enterado de la pregunta , El problema de timestamp Android SensorEvent que la marca de tiempo Nexus 7 es un estampado de tiempo unix, pero la diferencia entre mediciones sucesivas no siempre debe ser cero. El Nexus 4 y Nexus 7 tienen la misma IMU podría ser un error en la forma en que se crea la marca de tiempo de la IMU?

Wow, ok este es sin duda un error!

La marca de tiempo de cada SensorEvent se sobrescribe como si fuera una variable estática …

Cuando grabo una cadena de la marca de tiempo cuando se produce el evento, todos los valores son diferentes.

Los eventos se almacenan en una matriz sin cambios.

Cada SensorEvent en la matriz ahora tiene la misma marca de tiempo, pero los arrays de valores siguen siendo diferentes (es decir, no son el mismo objeto y contienen información diferente … EXCEPTO para la marca de tiempo).

Google / HTC, por favor regrese 3 horas de mi vida!

Voy a presentar un informe de error, a menos que alguien pueda explicar este comportamiento. Ciertamente no está documentado en la API .

Mientras tanto, pruebe esta solución :

 import android.hardware.Sensor; import android.hardware.SensorEvent; public class UnbrokenSensorEvent { public long timestamp; public float[] values; public Sensor sensor; public UnbrokenSensorEvent(SensorEvent event){ this.timestamp = event.timestamp; this.values = event.values; this.sensor = event.sensor; } } 

Luego haz algo como esto en tu oyente:

 ArrayList<UnbrokenSensorEvent> results = new ArrayList<UnbrokenSensorEvent>(); public void onSensorChanged(SensorEvent event) { results.add(new UnbrokenSensorEvent(event)); } 

La refactorización debe ser bastante fácil, ya que SensorEvent y UnbrokenSensorEvent tienen los mismos campos públicos. Si necesita usar otra funcionalidad de SensorEvent, simplemente vaya adelante y colóquela en la versión Ininterrumpida.

Es hacky, pero IMHO un rápido hack es siempre mejor que esperar a que una API se actualice!

También tenga en cuenta la documentación sobre SensorEventListener's onSensorChanged -method:

NOTA: La aplicación no posee el objeto de evento pasado como un parámetro y, por lo tanto, no puede retenerlo. El objeto puede ser parte de un grupo interno y puede ser reutilizado por el marco.

Encontrado aquí: http://developer.android.com/reference/android/hardware/SensorEventListener.html#onSensorChanged%28android.hardware.SensorEvent%29

… lo que sugiere que uno no debe tener referencias a objetos SensorEvent.

Si ha copiado un fragmento de aquí , tenga en cuenta que tiene un error. Necesita reemplazar

 private float timestamp; 

a

 private long timestamp; 

En otro caso su tiempo delta siempre contendrá un valor extraño

  • Android - Cómo marcar marcas de tiempo en un SeekBar
  • ¿Cómo comparar dos marcas de tiempo en android?
  • Insertar una marca de tiempo en la base de datos a través de ContentValues
  • ¿Cómo obtener la hora actual del servidor firebase en milisegundos?
  • Android: obtenga la hora de la fecha de la marca de tiempo de SMS en milisegundos
  • ¿Se convierte la cadena de fecha en timestamp en Android?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.