TYPE_LINEAR_ACCELERATION和TYPE_GRAVITY不起作用

时间:2015-02-24 18:50:53

标签: android android-sensors

我正在开展一个项目,除此之外,我正在尝试获取没有重力组件的加速度计数据。但是,我似乎无法从虚拟传感器获得更新:“线性加速”和“重力”。这是代码:

    public class SensorModule implements SensorEventListener{

    (...)

    public SensorModule(Context context){

        this.context = context;
        sensorManager = (SensorManager) context.getSystemService(context.SENSOR_SERVICE);
        sensorAccelerometer = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
        sensorMagneticField = sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);
        sensorLinearAccel = sensorManager.getDefaultSensor(Sensor.TYPE_LINEAR_ACCELERATION);
        sensorGravity = sensorManager.getDefaultSensor(Sensor.TYPE_GRAVITY);
    }

    @Override
    public void onAccuracyChanged(Sensor arg0, int arg1) {}

    @Override
    public void onSensorChanged(SensorEvent event) {
        switch(event.sensor.getType()){
        case Sensor.TYPE_ACCELEROMETER:
            ((SensorActivity)context).accelX.setText("" + event.values[0]);
            ((SensorActivity)context).accelY.setText("" + event.values[1]);
            ((SensorActivity)context).accelZ.setText("" + event.values[2]);
            break;
        case Sensor.TYPE_MAGNETIC_FIELD:
            ((SensorActivity)context).magneX.setText("" + event.values[0]);
            ((SensorActivity)context).magneY.setText("" + event.values[1]);
            ((SensorActivity)context).magneZ.setText("" + event.values[2]);
            break;
        case Sensor.TYPE_LINEAR_ACCELERATION:
            ((SensorActivity)context).linearX.setText("" + event.values[0]);
            ((SensorActivity)context).linearY.setText("" + event.values[1]);
            ((SensorActivity)context).linearZ.setText("" + event.values[2]);
            break;
        case Sensor.TYPE_GRAVITY:
            ((SensorActivity)context).gravityX.setText("" + event.values[0]);
            ((SensorActivity)context).gravityY.setText("" + event.values[1]);
            ((SensorActivity)context).gravityZ.setText("" + event.values[2]);
        }
    }

    public void registerListeners(){
        sensorManager.registerListener(this, sensorAccelerometer, SensorManager.SENSOR_DELAY_NORMAL);
        sensorManager.registerListener(this, sensorMagneticField, SensorManager.SENSOR_DELAY_NORMAL);
        sensorManager.registerListener(this, sensorLinearAccel, SensorManager.SENSOR_DELAY_NORMAL);
        sensorManager.registerListener(this, sensorGravity, SensorManager.SENSOR_DELAY_NORMAL);
    }

    public void unregisterListeners(){
        sensorManager.unregisterListener(this, sensorAccelerometer);
        sensorManager.unregisterListener(this, sensorMagneticField);
        sensorManager.unregisterListener(this, sensorLinearAccel);
        sensorManager.unregisterListener(this, sensorGravity);
    }

我在活动中注册了侦听器onResume()并取消注册onPause()。我可以从加速度计和磁力计获得更新,但TYPE_LINEAR_ACCELERATION和TYPE_GRAVITY不会产生任何更新。我知道我的设备有来自getSensorList(Sensor.TYPE_ALL)的这些虚拟传感器。此外,当我调用getDefaultSensor(...)时,它会为这4个传感器中的每一个返回非null。我分别在onSensorChanged()方法中对每个案例进行了烘焙,但是线性和重力都没有出现,这意味着没有生成这些更新。我也尝试了更大的延迟(SENSOR_DELAY_UI)给它更多的时间,但仍然没有骰子。我正在测试运行Lollipop 5.0.1的Nexus 5(API 21)。有人知道吗?

1 个答案:

答案 0 :(得分:2)

确定,通过应用第一个工程规则和一般常识来解决问题:)只需将其关闭再打开,现在它可以自动运行。这有点令人不安,因为这意味着我无法知道传感器是否正常工作,而不是使用超时线程来验证定期更新。