Utilizar getRotationMatrix y getOrientation en Android 2.1
He estado teniendo problemas con esto por mucho tiempo. Este código debería producir dx, dy, dz para el acelerómetro, y un total de ejecución de la dx. También debe producir azimut, tono y rollo.
He utilizado la información dada aquí , pero en vano.
- ¿El filtrado del acelerómetro de Android?
- UnregisterListener no funciona con PROXIMITY_SCREEN_OFF_WAKE_LOCK
- Necesidad de calcular el vector de rotación a partir de los datos de Sensor.TYPE_ORIENTATION
- Azimut encontrado con Sensor.TYPE_MAGNETIC_FIELD mucho más inestable que Sensor.TYPE_ORIENTATION
- Medición de distancia con sensor láser IR Nexus 6P y 5X
Este código no genera correctamente el tono, azimut o rollo. Produce 0.0, -0.0, -0.0 para las últimas tres vistas de texto, respectivamente.
switch (event.sensor.getType()) { case Sensor.TYPE_ACCELEROMETER: accelerometerValues = event.values.clone(); case Sensor.TYPE_MAGNETIC_FIELD: geomagneticMatrix = event.values.clone(); sensorReady = true; break; default: break; } if (geomagneticMatrix != null && accelerometerValues != null && sensorReady) { sensorReady = false; float[] R = new float[16]; float[] I = new float[16]; SensorManager.getRotationMatrix(R, I, accelerometerValues, geomagneticMatrix); float[] actual_orientation = new float[3]; SensorManager.getOrientation(R, actual_orientation); tvXCoordinate.setText(accelerometerValues[0] + ""); tvYCoordinate.setText(accelerometerValues[1] + ""); tvZCoordinate.setText(accelerometerValues[2] + ""); floatXTotal += accelerometerValues[0]; tvXTotal.setText(floatXTotal + ""); tvAzimuth.setText(actual_orientation[0] + ""); tvPitch.setText(actual_orientation[1] + ""); tvRoll.setText(actual_orientation[2] + ""); }
- Activar y desactivar la pantalla mediante programación en android
- Valor de Android: Sensor.getResolution ()
- Galaxy s3 tiene sensor de temperatura?
- Edición de Pitch and Roll de Android
- Detectar si el teléfono está en el bolsillo o no
- ¿Cómo reemplazar adecuadamente Sensor.TYPE_ORIENTATION (que ahora está obsoleto)?
- Diferentes valores entre los sensores TYPE_ACCELEROMETER / TYPE_MAGNETIC_FIELD y TYPE_ORIENTATION
- Sistema de coordenadas del dispositivo Android Convert a sistema de coordenadas "usuario"
Puedo estar perdiendo algo (y usted puede haber resuelto esto ya), pero a mí parece que su declaración de switch es incorrecta:
switch (event.sensor.getType()) { case Sensor.TYPE_ACCELEROMETER: accelerometerValues = event.values.clone(); case Sensor.TYPE_MAGNETIC_FIELD: geomagneticMatrix = event.values.clone(); sensorReady = true; break; default: break; }
Si su evento de sensor es TYPE_ACCELEROMETER
los valores del evento serán clonados tanto en accelerometerValues
como en geomagneticMatrix
y sensorReady
se establecerá en true. Creo que es posible que necesite cambiar el orden de este bloque o, posiblemente, añadir un break;
Después de su primer caso.
La razón por la que obtiene 0.0, -0.0, -0.0 de getOrientation () es que getRotationMatrix () no siempre obtiene un resultado válido. Debe comprobar el valor devuelto de getRotationMatrix (), que será falso si el resultado no es válido, o true si se logra.
Añadido: En realidad, eso no salió bien. Usted está recibiendo un resultado no válido por la razón aganders señaló. Comprobar el valor devuelto simplemente sería una indicación de que de hecho obtuvo un resultado no válido.
- ¿Qué dispositivos admiten y no admiten el modo USB Host?
- Android: Consulta del registro de llamadas después de que se haya actualizado una vez que termina una llamada