estoy haciendo una aplicación de mapas, incluyendo la flecha ubicación que le muestra el camino que está enfrentando, así:¿Cómo conseguir la orientación del teléfono Android que coincida con la orientación humana?
puedo obtener la orientación directamente de SensorManager.getOrientation()
, utilizando el primer valor devuelto: azimut. Cuando se sostiene el teléfono para que la pantalla apunte sobre el horizonte y en vertical, la flecha funciona bien. Sin embargo:
- Cuando se sostiene el teléfono de manera que la pantalla apunte debajo del horizonte, la flecha apunta 180 grados con respecto a la dirección que está mirando el usuario.
- Cuando se sostiene el teléfono para que la pantalla quede alineada con el horizonte, la flecha no tiene ni idea de qué dirección apunta. Azimuth no devuelve resultados significativos en absoluto.
- Cuando el teléfono se inclina hacia la izquierda o hacia la derecha (o se mantiene en modo horizontal), la flecha se inclina hacia la izquierda o hacia la derecha.
La imagen cuidadosamente construida y científica a continuación muestra lo que quiero decir (donde el azul es el frente del usuario, el rojo es la dirección de la flecha, la pantalla está enfrentando al usuario y Google Maps hace exactamente lo que quiero):
(Tenga en cuenta que, con Google Maps, no lo hace con éxito los últimos dos acciones en la lista si auto-rotación está apagado. Pero ni siquiera estoy en esa etapa, sin embargo. Uno cosa a la vez.)
Parece como si fuera simplemente usando la dirección de puntería del eje Y como se muestra aquí: http://developer.android.com/reference/android/hardware/SensorEvent.html, cuando quiero que use la dirección opuesta al eje Z, la mayoría de las veces, y la Y cuando el teléfono está plano. Sin embargo, dados los valores que devuelve getOrientation()
, tendría que escribir casos complejos para corregir algunos de los problemas, y el caso de uso del teléfono que se enfrenta al horizonte no tiene solución. Estoy seguro de que hay una manera más fácil.
Aquí está mi código (cuando lastAcceleration y lastMagneticField ambos llegaron desde el sensor interno):
float[] rotationMatrix = new float[9];
if(SensorManager.getRotationMatrix(rotationMatrix, null, lastAcceleration, lastMagneticField)){
float[] orientMatrix = new float[3];
SensorManager.getOrientation(rotationMatrix, orientMatrix);
orientation = orientMat[0]*180/(float)Math.PI;
}
¿Qué estoy haciendo mal? ¿Hay alguna forma más fácil de hacer esto?
Editar: Solo para aclarar, supongo que el usuario está sosteniendo el dispositivo en frente de ellos, y la pantalla apunta hacia ellos. Más allá de eso, obviamente no puedo decir si solo uno de ellos rota. Además, estoy usando el movimiento del usuario cuando se están moviendo, pero esto es para cuando están estacionarios.
+1 para la imagen científica –
¿Ha resuelto su problema? ¿Cómo obtuviste lastAcceleration, lastMagneticField? –
No. Nunca resuelto Tal vez nunca fue solucionable, y parece que Google Maps no fue tan inteligente como pensé en ese momento. Hace tiempo que lo descarté de mi lista de tareas que necesitaba hacer, ya que ya no trabajo para la misma empresa, y mucho menos para el mismo proyecto. Android de todos modos funciona de manera totalmente diferente en estos días, de todos modos. – AlbeyAmakiir