title: Direction using sensor
body: <p>In my app i wanted to show device direction such as north, south, east, west. For that i am using accelerometer and magnetic sensor and tried with following code.</p>
  
  <pre><code>public class MainActivity extends Activity implements SensorEventListener 
  {
  
  public static float swRoll;
  public static float swPitch;
  public static float swAzimuth;
  
  
  public static SensorManager mSensorManager;
  public static Sensor accelerometer;
  public static Sensor magnetometer;
  
  public static float[] mAccelerometer = null;
  public static float[] mGeomagnetic = null;
  
  
  public void onAccuracyChanged(Sensor sensor, int accuracy) {
  }
  
  @Override
  public void onSensorChanged(SensorEvent event) 
  {
      // onSensorChanged gets called for each sensor so we have to remember the values
      if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) 
      {
          mAccelerometer = event.values;
      }
  
      if (event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD) 
      {
          mGeomagnetic = event.values;
      }
  
      if (mAccelerometer != null &amp;&amp; mGeomagnetic != null) 
      {
          float R[] = new float[9];
          float I[] = new float[9];
          boolean success = SensorManager.getRotationMatrix(R, I, mAccelerometer, mGeomagnetic);
  
          if (success) 
          {
              float orientation[] = new float[3];
              SensorManager.getOrientation(R, orientation);
              // at this point, orientation contains the azimuth(direction), pitch and roll values.
              double azimuth = 180 * orientation[0] / Math.PI;
              //double pitch = 180 * orientation[1] / Math.PI;
              //double roll = 180 * orientation[2] / Math.PI;
  
              Toast.makeText(getApplicationContext(), "azimuth: "+azimuth, Toast.LENGTH_SHORT).show();
              //Toast.makeText(getApplicationContext(), "pitch: "+pitch, Toast.LENGTH_SHORT).show();
              //Toast.makeText(getApplicationContext(), "roll: "+roll, Toast.LENGTH_SHORT).show();
          }
      }
  }
  
  
  
  @Override
  protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      mSensorManager = (SensorManager)getSystemService(SENSOR_SERVICE);
      accelerometer = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
      magnetometer = mSensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);
  }
  
  @Override
  protected void onResume() {
      super.onResume();
  
      mSensorManager.registerListener(this, accelerometer, SensorManager.SENSOR_DELAY_GAME);
      mSensorManager.registerListener(this, magnetometer, SensorManager.SENSOR_DELAY_GAME);
  }
  
  @Override
  protected void onPause() {
      super.onPause();
      mSensorManager.unregisterListener(this, accelerometer);
      mSensorManager.unregisterListener(this, magnetometer);
  }
  }
  </code></pre>
  
  <p>I read some artical and come to know that azimuth value is use for getting direction. But it not shows proper value i.e it always shows value between 103 to 140 in any direction. I am using samsung galaxy s for test purpose. where i goes wrong. 
  Any help will be appreciated...thank you</p>