Search code examples
androidorientationaccelerometer

I want to access the orientation and accelerometer sensor at the same time. What is the right way to do this?


I want to access the orientation and accelerometer sensor at the same time. What is the right way to do this?

I am using

public class MainActivity extends Activity
{
    private SensorManager sensorManager;
    private Sensor sensor;
    private Sensor sensor2;
    private float x, y, z;
    private float x1, y1, z1;
    private String output;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
        sensor = sensorManager.getSensorList(Sensor.TYPE_ACCELEROMETER).get(0);
        sensor2 = sensorManager.getSensorList(Sensor.TYPE_ORIENTATION).get(0);
    }

    private void refreshDisplay() {
        output = String.format(";%f;%f;%f;%f;%f;%f", x, y, z, x1, y1, z1);
    }

    @Override
    protected void onResume() {
        super.onResume();
        sensorManager.registerListener(accelerationListener, sensor,
        SensorManager.SENSOR_DELAY_GAME);
        sensorManager.registerListener(orientationListener, sensor2,
        SensorManager.SENSOR_DELAY_GAME);
    }

    @Override
    protected void onPause() {
        sensorManager.unregisterListener(accelerationListener);
        sensorManager.unregisterListener(orientationListener);
        super.onStop();
    }

    private SensorEventListener accelerationListener = new SensorEventListener() {
        @Override
        public void onAccuracyChanged(Sensor sensor, int acc) {
        }

        @Override
        public void onSensorChanged(SensorEvent event) {
            x = event.values[0];
            y = event.values[1];
            z = event.values[2];
            refreshDisplay();
        }

    };

    private SensorEventListener orientationListener = new SensorEventListener() {
        @Override
        public void onAccuracyChanged(Sensor sensor, int acc) {
        }

        @Override
        public void onSensorChanged(SensorEvent event) {
            x1 = event.values[0];
            y1 = event.values[1];
            z1 = event.values[2];
            refreshDisplay();
        }

    };        
}

But this is choppy. Using only sensor or the accelerometer is smooth.

EDITED: OnPause


Solution

  • I want to access the orientation and accelerometer sensor at the same time. What is the right way to do this?

    I would use getDefaultSensor() on SensorManager rather than assume that the 0th entry in the list is the right one.

    Also, either use onResume() and onPause() as a pair or use onStart() and onStop() as a pair. You are using onResume() and onStop(), which means there may be cases where you register for sensor events multiple times.

    But this is choppy

    Considering that you are not doing anything with the data in the code that you have shown above, I have no idea how you can tell that something is "choppy". Moreover, what your real code does with the data may be the cause of the "choppy" behavior with twice the data input -- use Traceview to figure out where you are spending more-than-expected time.