2012-07-04 32 views
6

Uso de Location.getBearing(); Parece que tengo rodamientos que cambian aleatoriamente.Dispositivo Android (GPS) Dirección

Aka, puedo girar el dispositivo lentamente y no se dará cuenta, simplemente elige sus propios rodamientos aleatorios.

Sé que el dispositivo está funcionando, ya que el ícono "Usted está aquí" en la aplicación Mapas en la tableta gira lentamente mientras giro el dispositivo.

¿Hay alguna forma diferente de obtener un rodamiento? Estoy usando el GPS. Tal vez haya una mejor manera de determinar en qué dirección se está enfrentando.

+0

has llegado nada por su cuenta? Estoy enfrentando el mismo comportamiento y buscando algún tipo de orientación. –

+0

@kaushaltrivedi Por favor vea mi respuesta :) lo desenterré solo para usted. Basado en la respuesta de heroms, pero con el problema de orientación que planteó ... corregido. – Doomsknight

Respuesta

3

El Location.getBearing() devuelve el rumbo que los satélites GPS calcularon para usted. No es una representación en tiempo real del título de su dispositivo. La aplicación Google Maps usa los sensores G integrados en el dispositivo para obtener la dirección que estás enfrentando.

+1

Para aclarar un poco más, el rumbo del GPS se calcula al obtener el vector entre dos puntos a lo largo de la ruta de desplazamiento, en lugar de utilizar un accelametro para detectar el movimiento del dispositivo. –

+0

@Jon Entonces, digo, muevo un metro hacia atrás, supongo que me muevo en la dirección dada pero mirando hacia el otro lado (hacia adelante). Me pregunto por qué tengo que contactar al satélite para obtener mi dirección, ya que no hay forma de que conozca mi orientación más de lo que lo hace el dispositivo. – Doomsknight

+2

@Doomsknight sí, eso es correcto, le mostrará la dirección del viaje. Calcula el vector direccional entre el punto en el que estás ahora y el punto del que vienes. Entonces, como dijiste si caminas hacia atrás, te mostrará que caminas en la dirección del movimiento, no en la dirección que estás mirando (en contra de la dirección de viaje). –

0

Después de la respuesta de herom a través del enlace: http://android-coding.blogspot.co.at/2012/03/create-our-android-compass.html

Extendí mi clase para implementar el sensor: extends Activity implements SensorEventListener

y puesto en práctica como se sugiere, pero modificado para tomar en cuenta, la orientación de la pantalla.

Aquí está el código Fui con:

@Override 
public void onSensorChanged(SensorEvent event) { 
    switch(event.sensor.getType()){ 
    case Sensor.TYPE_ACCELEROMETER: 
     for(int i =0; i < 3; i++){ 
      valuesAccelerometer[i] = event.values[i]; 
     } 
     break; 
    case Sensor.TYPE_MAGNETIC_FIELD: 
     for(int i =0; i < 3; i++){ 
      valuesMagneticField[i] = event.values[i]; 
     } 
     break; 
    } 

    boolean success = SensorManager.getRotationMatrix(
      matrixR, 
      matrixI, 
      valuesAccelerometer, 
      valuesMagneticField); 

    if(success){ 
     SensorManager.getOrientation(matrixR, matrixValues); 

     double azimuth = Math.toDegrees(matrixValues[0]); 
     //double pitch = Math.toDegrees(matrixValues[1]); 
     //double roll = Math.toDegrees(matrixValues[2]); 

     WindowManager mWindowManager = (WindowManager) getSystemService(WINDOW_SERVICE); 
     Display mDisplay = mWindowManager.getDefaultDisplay(); 

     Float degToAdd = 0f; 

     if(mDisplay.getRotation() == Surface.ROTATION_0) 
      degToAdd = 0.0f; 
     if(mDisplay.getRotation() == Surface.ROTATION_90) 
      degToAdd = 90.0f; 
     if(mDisplay.getRotation() == Surface.ROTATION_180) 
      degToAdd = 180.0f; 
     if(mDisplay.getRotation() == Surface.ROTATION_270) 
      degToAdd = 270.0f; 

     mapView.setFacingDirection((float) (azimuth + degToAdd)); //DEGREES NOT RADIANS 
    } 
} 
+0

puede echar un vistazo a http://stackoverflow.com/questions/35692195/android-heading-direction-not-showing-correct-heading –