我想同时访问方向和加速计传感器。这样做的正确方法是什么?

时间:2012-05-06 22:25:25

标签: android orientation accelerometer

我想同时访问方向和加速计传感器。这样做的正确方法是什么?

我正在使用

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();
        }

    };        
}

但这很不稳定。仅使用传感器或加速度计是平滑的。

已编辑:OnPause

1 个答案:

答案 0 :(得分:1)

  

我想同时访问方向和加速计传感器。这样做的正确方法是什么?

我会在getDefaultSensor()上使用SensorManager,而不是假设列表中的第0个条目是正确的。

另外,要么使用onResume()onPause()作为一对,要么使用onStart()onStop()作为一对。您正在使用onResume()onStop(),这意味着您可能会多次注册传感器事件。

  

但这很不稳定

考虑到你没有对上面显示的代码中的数据做任何事情,我不知道你怎么能说出某些东西是“波涛汹涌”的。此外,您的真实代码对数据的作用可能是导致数据输入两倍的“波动”行为的原因 - 使用Traceview来确定您花费的时间超过预期的时间。