getOrientation检测转向x轴; getRotationMatrix返回全零

时间:2015-03-07 21:26:18

标签: java android android-sensors

我使用getOrientation(R,I,gravity,magVals)来检测绕x轴的转动。现在我只想在屏幕上显示x值读数,但值总是为零,我不知道为什么。

编辑:经过一番调查后,我发现getRotationMatrix总是返回全零。加速度计和磁场参数虽然很好。我仍然不知道为什么。

编辑:我添加了ACCESS_COARSE_LOCATION和ACCESS_FINE_LOCATION权限,结果仍然相同。 请注意,我也经历了过去可以找到的解决getRotationMatrix问题的问题,但没有解决我的问题。

我的实施方法:
1.添加加速度计和磁场监听器
2.每次发生加速度计/磁场事件时调用getRotationMatrix 3.将旋转矩阵传递给getOrientation调用(每当事件发生时也调用)

以下是处理方向的片段中onCreateView的一部分:

        TextView xRotation = new TextView(rootView.getContext());

        //Magnetic Sensor
        Sensor magneticSensor = sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);
        SensorEventListener magneticSel = new OtherSensorEventListener (xRotation);
        sensorManager.registerListener(magneticSel, magneticSensor, SensorManager.SENSOR_DELAY_NORMAL);

        //Accelerometer
        Sensor accelSensor = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
        SensorEventListener accelSel = new OtherSensorEventListener(xRotation);
        sensorManager.registerListener(accelSel, accelSensor, SensorManager.SENSOR_DELAY_NORMAL);

        layout.addView(xRotation);
        layout.setOrientation(LinearLayout.VERTICAL);
        return rootView;

这是OtherSensorEventListener()类:

    public static class OtherSensorEventListener implements SensorEventListener {

    float [] magVals = new float[3];
    float [] accelVals = new float [3];
    float [] RMatrix;
    TextView output;

    public OtherSensorEventListener(TextView output) {
        this.output = output;
    }


    @Override
    public void onSensorChanged(SensorEvent event) {            
        switch(event.sensor.getType()) {

        case Sensor.TYPE_MAGNETIC_FIELD:
            magVals = event.values.clone();
            break;
        case Sensor.TYPE_ACCELEROMETER:
            accelVals = event.values.clone();
            break;
        default:
            break;
        }

        if (accelVals != null && magVals != null) {

            RMatrix = new float[16];

            SensorManager.getRotationMatrix(RMatrix, null, accelVals, magVals);
            SensorManager.getOrientation(RMatrix, orientation);
            output.setText("X Rotation: " + orientation[1]);

        }
    }

    @Override
    public void onAccuracyChanged(Sensor sensor, int accuracy) {}
}

这是方向全局变量(在MainActivity中声明):

    static float [] orientation = new float[3];

我是Android新手。我不知道是否有比getOrientation更好的方法来做到这一点,但我必须将它作为我实验室的一部分。注意:我没有要求你为我做我的实验室,我只需要帮助调试

1 个答案:

答案 0 :(得分:0)

你传入了两个不同的听众

new OtherSensorEventListener (xRotation);

因此,参数accelValsmagVals中的任何一个始终为零数组,因此getOrientation始终返回0

尝试

SensorEventListener sensorEventListener = new OtherSensorEventListener (xRotation);
sensorManager.registerListener(sensorEventListener, magneticSensor, SensorManager.SENSOR_DELAY_NORMAL);
sensorManager.registerListener(sensorEventListener, accelSensor, SensorManager.SENSOR_DELAY_NORMAL);