在Android 2.1中使用getRotationMatrix和getOrientation

我一直有这个问题太久了。 这个代码应该输出加速度计的dx,dy,dz和dx的运行总数。 它也应该输出方位angular,俯仰angular和滚转angular。

我已经使用了这里给出的信息 ,但是无济于事。

此代码不能正确输出音调,方位angular或滚动。 它为最后三个文本分别输出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] + ""); } 

Solutions Collecting From Web of "在Android 2.1中使用getRotationMatrix和getOrientation"

我可能会错过一些东西(你可能已经解决了这个问题),但对我来说,看起来你的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 ,事件的值将被克隆到accelerometerValues并且geomagneticMatrixsensorReady将被设置为true。 我想你可能需要改变这个块的顺序,或者可能需要添加一个break; 在你的第一个案件后。

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

补充:实际上,这是不对的。 由于aganders指出,你得到一个无效的结果。 检查返回值只是表明你实际上得到了一个无效的结果。