0

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

Zurechtweiser
  • 1,165
  • 2
  • 16
  • 29

1 Answers1

1

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.

CommonsWare
  • 986,068
  • 189
  • 2,389
  • 2,491
  • What I mean by choppy is that as soon as I include the orientation sensor, the app seems to slow down till it gets data from the orientation sensor. The acc. is much faster, I simply commented the orientation sensor and voilá it is much faster. I want the orientation sensor to not slow the other sensor down. If there's no data from it, then the previous value is to be used. How can I do that? – Zurechtweiser May 07 '12 at 23:02
  • @RichartBremer: Therefore, you need to determine what the cause is. For example, perhaps the processing you are doing on an event is too much and you are getting too many events with the orientation sensor. Hence, use Traceview to understand better why you are choppy. – CommonsWare May 07 '12 at 23:06
  • Alright, I solved it by using http://stackoverflow.com/questions/4343342/is-there-a-way-to-retrieve-multiple-sensor-data-in-android - the solution was to not create a sensoreventlistener for each sensor but to stack them. – Zurechtweiser May 07 '12 at 23:42