在Android 2.1中使用getRotationMatrix和getOrientation

时间:2010-06-03 06:20:56

标签: java android events matrix sensor

我长期以来一直遇到这个问题。此代码应输出加速度计的dx,dy,dz以及dx的运行总和。它还应输出方位角,俯仰和滚动。

I've used the information given here,但无济于事。

此代码无法正确输出音高,方位角或滚动。它分别为最后三个文本视图输出0.0,-0.0,-0.0。

switch (event.sensor.getType()) {
    case Sensor.TYPE_ACCELEROMETER:
        accelerometerValues = event.values.clone();
    case Sensor.TYPE_MAGNETIC_FIELD:
        geomagneticMatrix = event.values.clone();
        sensorReady = true;
        break;
    default:
        break;
}   

if (geomagneticMatrix != null && accelerometerValues != null && sensorReady) {
    sensorReady = false;

    float[] R = new float[16];
    float[] I = new float[16];

    SensorManager.getRotationMatrix(R, I, accelerometerValues, geomagneticMatrix);

    float[] actual_orientation = new float[3];
    SensorManager.getOrientation(R, actual_orientation);

    tvXCoordinate.setText(accelerometerValues[0] + "");
    tvYCoordinate.setText(accelerometerValues[1] + "");
    tvZCoordinate.setText(accelerometerValues[2] + "");

    floatXTotal += accelerometerValues[0];
    tvXTotal.setText(floatXTotal + "");

    tvAzimuth.setText(actual_orientation[0] + "");
    tvPitch.setText(actual_orientation[1] + "");
    tvRoll.setText(actual_orientation[2] + "");
}

2 个答案:

答案 0 :(得分:6)

我可能会遗漏一些东西(你可能已经解决了这个问题),但对我来说,看起来你的switch语句不正确:

switch (event.sensor.getType()) {
        case Sensor.TYPE_ACCELEROMETER:
            accelerometerValues = event.values.clone();
        case Sensor.TYPE_MAGNETIC_FIELD:
            geomagneticMatrix = event.values.clone();
            sensorReady = true;
            break;
        default:
            break;
    }

如果您的传感器事件为TYPE_ACCELEROMETER,则事件的值将克隆到accelerometerValuesgeomagneticMatrixsensorReady将设置为true。我想您可能需要更改此块的顺序,或者在第一个案例之后添加break;

答案 1 :(得分:2)

你从getOrientation()获得0.0,-0.0,-0.0的原因是getRotationMatrix()并不总是得到有效的结果。您需要检查getRotationMatrix()的返回值,如果结果无效,则返回false;如果成功,则返回true。

补充:实际上,这并不是正确的。由于aganders指出的原因,你得到的结果无效。检查返回值只表示您实际上是在获得无效结果。