API Demos -> Graphics -> Compass
It works properly only, until you don\'t change the device natural orientation. In most phones is the portrait and most 10 inch tabl
This is how I do the magic in my application:
float[] rotationMatrixOrig = new float[9];
SensorManager.getRotationMatrix(rotationMatrixOrig, null, lastAccelerometerValue, lastMagnetometerValue);
int screenRotation = app.getCurrentActivity().getWindowManager().getDefaultDisplay().getRotation();
int axisX, axisY;
boolean isUpSideDown = lastAccelerometerValue[2] < 0;
switch (screenRotation) {
case Surface.ROTATION_0:
axisX = (isUpSideDown ? SensorManager.AXIS_MINUS_X : SensorManager.AXIS_X);
axisY = (Math.abs(lastAccelerometerValue[1]) > 6.0f ?
(isUpSideDown ? SensorManager.AXIS_MINUS_Z : SensorManager.AXIS_Z) :
(isUpSideDown ? SensorManager.AXIS_MINUS_Y : SensorManager.AXIS_Y));
break;
case Surface.ROTATION_90:
axisX = (isUpSideDown ? SensorManager.AXIS_MINUS_Y : SensorManager.AXIS_Y);
axisY = (Math.abs(lastAccelerometerValue[0]) > 6.0f ?
(isUpSideDown ? SensorManager.AXIS_Z : SensorManager.AXIS_MINUS_Z) :
(isUpSideDown ? SensorManager.AXIS_X : SensorManager.AXIS_MINUS_X));
break;
case Surface.ROTATION_180:
axisX = (isUpSideDown ? SensorManager.AXIS_X : SensorManager.AXIS_MINUS_X);
axisY = (Math.abs(lastAccelerometerValue[1]) > 6.0f ?
(isUpSideDown ? SensorManager.AXIS_Z : SensorManager.AXIS_MINUS_Z) :
(isUpSideDown ? SensorManager.AXIS_Y : SensorManager.AXIS_MINUS_Y));
break;
case Surface.ROTATION_270:
axisX = (isUpSideDown ? SensorManager.AXIS_Y : SensorManager.AXIS_MINUS_Y);
axisY = (Math.abs(lastAccelerometerValue[0]) > 6.0f ?
(isUpSideDown ? SensorManager.AXIS_MINUS_Z : SensorManager.AXIS_Z) :
(isUpSideDown ? SensorManager.AXIS_MINUS_X : SensorManager.AXIS_X));
break;
default:
axisX = (isUpSideDown ? SensorManager.AXIS_MINUS_X : SensorManager.AXIS_X);
axisY = (isUpSideDown ? SensorManager.AXIS_MINUS_Y : SensorManager.AXIS_Y);
}
float[] rotationMatrix = new float[9];
SensorManager.remapCoordinateSystem(rotationMatrixOrig, axisX, axisY, rotationMatrix);