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.
nice explanation, thanks.