Android设备旋转不';与文档不匹配

Android设备旋转不';与文档不匹配,android,accelerometer,android-sensors,magnetometer,Android,Accelerometer,Android Sensors,Magnetometer,我试图找出一个设备(三星Galaxy S5)的旋转,我如下所示: private float[]rawDeviceRotation; 私人浮动设备加速; 私人地磁; 私有浮点[]旋转矩阵=新浮点[9]; 浮动[]方向=新浮动[3]; // ... @凌驾 传感器更改时的公共无效(传感器事件){ if(event.sensor.getType()==sensor.TYPE\u ROTATION\u VECTOR){ rawDeviceRotation=event.values.clone(); }

我试图找出一个设备(三星Galaxy S5)的旋转,我如下所示:

private float[]rawDeviceRotation;
私人浮动设备加速;
私人地磁;
私有浮点[]旋转矩阵=新浮点[9];
浮动[]方向=新浮动[3];
// ...
@凌驾
传感器更改时的公共无效(传感器事件){
if(event.sensor.getType()==sensor.TYPE\u ROTATION\u VECTOR){
rawDeviceRotation=event.values.clone();
}
else if(event.sensor.getType()==sensor.TYPE\u加速计){
rawDeviceAcceleration=event.values.clone();
}
else if(event.sensor.getType()==sensor.TYPE\u磁场){
rawGeomagic=event.values.clone();
if(SensorManager.getRotationMatrix(rotationMatrix,null,rawDeviceAcceleration,Raw地磁)){
SensorManager.getOrientation(旋转矩阵,方向);
//方向[0]~-0.62+0.62
//方向[1]~-0.31+0.31
//方向[2]~-0.62+0.62
}
}
}
我得到了一些东西,但不是文档中说明的值

方位角(绕-z轴旋转的角度)。这是设备当前罗盘方向和磁北之间的角度。如果设备的上边缘朝向磁北,则方位角为0度;如果顶部边缘朝南,则方位角为180度。类似地,如果顶边朝东,则方位角为90度,如果顶边朝西,则方位角为270度

俯仰(绕x轴旋转的角度)。这是平行于设备屏幕的平面与平行于地面的平面之间的角度。如果您保持设备与地面平行,底部边缘离您最近,并将设备顶部边缘向地面倾斜,则俯仰角变为正值。朝相反方向倾斜-将设备顶部边缘移离地面会导致俯仰角变为负值。值的范围为-180度到180度

滚动(绕y轴旋转的度数)。这是垂直于设备屏幕的平面与垂直于地面的平面之间的角度。如果您保持设备与地面平行,且底部边缘离您最近,并将设备左边缘向地面倾斜,则侧倾角度将变为正值。朝相反方向倾斜,将设备的右边缘移向地面-导致侧倾角度变为负值。值的范围为-90度到90度

首先,我得到的值的范围似乎与弧度或度数都没有多大关系

其次,如果按照文档中的说明向左倾斜,则滚动角度(或任何值)变为负值,反之亦然

要么是我做错了什么,要么是三星做错了什么,要么是文档错了。。。有没有什么好主意该怪谁(以及该怎么做来解决这个问题)

我使用内置的三星测试屏幕测试了手机的传感器,通过在拨号板中输入
*\0*\code>即可到达。它报告了正确的倾斜角度,通过了所有的自检等。因此,这似乎不太可能是硬件问题。我正在这个设备上运行安卓4.4.2

另外,我尝试在值上应用
Math.toDegrees()
,但没有得到任何合理的值(没有
90°
180°
或类似的值)

private float[] rawDeviceRotation;
private float[] rawDeviceAcceleration;
private float[] rawGeomagnetic;

private float[] rotationMatrix = new float[9];
float[] orientation = new float[3];

// ...

@Override
public void onSensorChanged(SensorEvent event) {
    if (event.sensor.getType() == Sensor.TYPE_ROTATION_VECTOR) {
        rawDeviceRotation = event.values.clone();
    }
    else if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
        rawDeviceAcceleration = event.values.clone();
    }
    else if (event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD) {
        rawGeomagnetic = event.values.clone();

        if( SensorManager.getRotationMatrix(rotationMatrix, null, rawDeviceAcceleration, rawGeomagnetic) ){
            SensorManager.getOrientation(rotationMatrix, orientation);

            // orientation[0] ~ -0.62 <-> +0.62
            // orientation[1] ~ -0.31 <-> +0.31
            // orientation[2] ~ -0.62 <-> +0.62
        }
    }
}