Android: detect device slope

It took me several hours to find the best way of detecting device slope on Android.

You Activity should contain the following code:

public class MyActivity extends Activity implements SensorEventListener
{
private SensorManager mSensorManager;
private float xy_angle;
    private float xz_angle;
    private float zy_angle;
@Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
// init sensors
        mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
}

protected void onResume() {
        super.onResume();
mSensorManager.registerListener(this, mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), 300000);
        
}

@Override
    protected void onDestroy() {
        super.onDestroy();
        mSensorManager.unregisterListener(this, mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER));
    }

@Override
    public void onSensorChanged(SensorEvent event) {
        synchronized (this) {
            switch (event.sensor.getType()){
                case Sensor.TYPE_ACCELEROMETER:
                    xy_angle = event.values[0];
                    xz_angle = event.values[1];
                    zy_angle = event.values[2];
                    break;
            }
        //Log.d(TAG, "xy_angle:"+xy_angle+", xz_angle"+xz_angle+", zy_angle"+zy_angle);

            if (xy_angle < -2){
                Log.d(TAG, "up");
            }
            if (xz_angle > 2){
                Log.d(TAG, "right");
            }
            if (xz_angle < -2) {
                Log.d(TAG, "left");
            }
            if (xy_angle > 2)   {
                Log.d(TAG, "down");
            }
           
        }
    }

}

Note: this worked perfectly on phones in landscape layout. Tablets should be investigated additionally.

1 comment

Leave a Reply

%d bloggers like this: