2013-03-01 16 views
8

sto cercando di ottenere il rilevamento della bussola in gradi (cioè 0-360) utilizzando il seguente metodo:Android bussola di rilevamento

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]; 
     boolean success = SensorManager.getRotationMatrix(R, I, mGravity, 
       mGeomagnetic); 
     if (success) { 
      float orientation[] = new float[3]; 
      SensorManager.getOrientation(R, orientation); 
      float azimut = orientation[0]; 
      bearing.setText("Bearing: "+ azimut); 
     } 
    } 
} 

Il valore azimut (ovvero orientation[0]) dovrebbe essere 0 < = azimut < 360 ma Ricevo solo valori da -3 a 3 mentre ruoto il mio dispositivo. Qualcuno può dirmi quale potrebbe essere il problema, per favore?

risposta

10

I valori sono espressi in radianti, si deve convertire in grado di arco

int azimut = (int) Math.round(Math.toDegrees(orientation[0])); 
+0

ringrazio molto @Hoan Nguyen – user1135357

+0

l'orientamento [0] sembra solo fornire una differenza dall'ultima lettura. Ho convertito il mio valore in gradi ma i valori sono ancora molto piccoli. C'è un modo per ottenere il rilevamento effettivo del dispositivo (0 - 360 gradi) in una singola lettura? –

+0

Non è un diff, è il rilevamento effettivo rispetto al nord magnetico. C'è qualcosa di sbagliato nel tuo codice se la tua lettura è sempre un piccolo valore. –

4

E 'vero che è in radianti. Grazie Hoan. Ho aggiunto un po 'di logica per ottenere che il rilevamento in gradi da 0 a 360 becuase se solo convertito in gradi, mi è stato sempre i valori da -180 a 180.

float azimuthInRadians = orientation[0]; 
float azimuthInDegress = (float)Math.toDegrees(azimuthInRadians)+360)%360; 
0
This answer applies to Google Maps api v2. 
It is possible by registering your application with Sensor Listener for Orientation and get the 
angle relative to true north inside onSensorChanged and update camera accordingly. 
Angle can be used for bearing. Following code can be used: 

Instead of using Sensor.TYPE_ORIENTATION try using getOrinetation api. Sensor.TYPE_ORIENTATION 
has been deprecated. 

@Override 
protected void onResume() { 
    // TODO Auto-generated method stub 
    super.onResume(); 
    if (sensorManager != null) 
     sensorManager.registerListener(this, 
       sensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION), 
       SensorManager.SENSOR_DELAY_GAME); 
} 

public void onSensorChanged(SensorEvent event) { 

    float compassBearingRelativeToTrueNorth = Math.round(event.values[0]); 

    Log.d(TAG, "Degree ---------- " + degree); 

    updateCamera(compassBearingRelativeToTrueNorth); 

} 

private void updateCamera(float bearing) { 
    CameraPosition oldPos = googleMap.getCameraPosition(); 

    CameraPosition pos = CameraPosition.builder(oldPos).bearing(bearing) 
      .build(); 

    googleMap.moveCamera(CameraUpdateFactory.newCameraPosition(pos)); 

}