Cómo obtener la dirección en Android (como el norte, oeste)

Soy nuevo en Android y quiero obtener dirección de acuerdo a mi cámara. ¿Cómo puedo obtener información de dirección según mi cámara? ¿Podría dar una idea para esto?

TYPE_ORIENTATION está obsoleto

Ya no podemos usar el Sensor de Orientación, podemos usar el Sensor de Campo Magnético y los Sensores de Acelerómetro en tándem para obtener una funcionalidad equivalente. Es más trabajo pero permite seguir utilizando una devolución de llamada para manejar los cambios de orientación.

Aquí está una muestra de la brújula : http://www.codingforandroid.com/2011/01/using-orientation-sensors-simple.html

Conversión de acelerómetro y campo magnético a azimut :

float[] mGravity; float[] mGeomagnetic; public void onSensorChanged(SensorEvent event) { if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) mGravity = event.values; if (event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD) mGeomagnetic = event.values; if (mGravity != null && mGeomagnetic != null) { float R[] = new float[9]; float I[] = new float[9]; if (SensorManager.getRotationMatrix(R, I, mGravity, mGeomagnetic)) { // orientation contains azimut, pitch and roll float orientation[] = new float[3]; SensorManager.getOrientation(R, orientation); azimut = orientation[0]; } } } 

Para apuntar hacia el norte se puede calcular una rotación en grados:

 float rotation = -azimut * 360 / (2 * 3.14159f); 

No está seguro de lo que quiere decir con acuerdo a su cámara, pero se puede obtener en función de los sensores de hardware. Vea los siguientes enlaces:

Ejemplo de compás

También consulta la Sensor.TYPE_ORIENTATION en esta página.

Esto es lo que tengo hasta ahora que es un poco de trabajo para mí, los valores devueltos están entre 0 – 360, pero no creo que el norte está correctamente calibrado? Estoy usando esto en un LG G Pad corriendo con Android 5.0.1

 public void onSensorChanged(SensorEvent event) { if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) mGravity = event.values; if (event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD) mGeomagnetic = event.values; if (mGravity != null && mGeomagnetic != null) { float R[] = new float[9]; float outR[] = new float[9]; float I[] = new float[9]; boolean success = SensorManager.getRotationMatrix(R, I, mGravity, mGeomagnetic); if (success) { float orientation[] = new float[3]; SensorManager.remapCoordinateSystem(R, SensorManager.AXIS_X, SensorManager.AXIS_Y, outR); SensorManager.getOrientation(outR, orientation); azimut = orientation[0]; float degree = (float)(Math.toDegrees(azimut)+360)%360; System.out.println("degree " + degree); 

Estoy seguro de que hay cosas que he perdido pero espero que este es un punto de partida decente para los demás. Revisé un buen número de otras preguntas, comentarios, etc. para llegar a este punto.

  • Botón de captura de medios en Android> = 4.0 (funciona en 2.3)
  • Setting launchMode = "singleTask" contra la actividad de configuración launchMode = "singleTop"
  • Android Studio 2.2.3: Error al ejecutar la aplicación: Actividad predeterminada no encontrada
  • Manifiesto GPS: GPS en la aplicación es opcional, quiere que esté disponible para GPS menos dispositivos también
  • El orden de instalar la aplicación está cambiando el comportamiento?
  • ¿Qué hace el atributo android: configChanges = "screenSize"?
  • Personalización de partes del manifiesto de Android
  • Cómo agregar una actividad de configuración de notificaciones a la configuración del sistema
  • Ya sea .. o distinción en Android <uses-feature> manifiesto
  • Excepción en el complemento de Android del complemento
  • Android: Pasar parámetros a la actividad de AndroidManifest.xml
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.