Android - SensorManager getOrientation的奇怪行为

时间:2010-07-07 14:43:15

标签: android orientation accelerometer sensor magnetometer

我需要检索手机的方向。目前我写了这个:

public void onSensorChanged(SensorEvent event) {
  switch (event.sensor.getType()){
  case Sensor.TYPE_MAGNETIC_FIELD:
    this.mag_vals = event.values.clone();
    this.sensorReady = true;
    break;
  case Sensor.TYPE_ACCELEROMETER:
    this.acc_vals = event.values.clone();
    break;
  }
  if (this.mag_vals != null && this.acc_vals != null && this.sensorReady) {
    this.sensorReady = false;
    float[] R = new float[ProjectConstants.SIZE_MATRIX];
    float[] I = new float[ProjectConstants.SIZE_MATRIX];
    SensorManager.getRotationMatrix(R, I, this.acc_vals, this.mag_vals);

    SensorManager.getOrientation(R, this.actual_orientation);
    ...  

如果我将手机放在平面上并将其旋转到表面上,此代码可让我获取手机的方向。

我不明白为什么如果我将手机向上移动this.actual_orientation[0]的值,即[此处] [1]所描述的zed轴上的旋转,虽然没有旋转,但值会增加

有人知道会发生什么吗?

修改

另一件奇怪的事情......

我在办公室里尝试了我的应用程序,它有我之前描述的奇怪行为.. 我在同一个办公室(相同的情况)尝试了一个指南针应用程序,我从市场上采取了它与我的相同的行为..当我向上移动手机时,价值一直变化.. 我试着在同一个办公室(同样的情况下)使用i-phone罗盘,但没有那种奇怪的行为!

然后,当我到家时,我尝试了两个,我的应用程序和我的Android手机的指南针应用程序,他们工作!!即使我向上移动电话价值稳定...

非常感谢。

[1]:http://developer.android.com/reference/android/hardware/SensorManager.html#getOrientation(float[],float [])

2 个答案:

答案 0 :(得分:4)

器件获得的取向估计部分取决于局部磁场方向。在建筑物内,靠近铁结构和靠近电器的情况下,感测到的磁场可以在以英尺为单位测量的距离上显着变化。使用手持式磁力计或高斯计可以很容易地看到这种效果。

我怀疑这些扭曲是导致你的应用程序出现奇怪行为的原因。

答案 1 :(得分:1)

当你抬起它时,你会引入一个旋转角度,这会影响getOrientation中的返回值。旋转角度测量设备从正常位置的旋转量,即对于大多数正常位置意味着设备的设备,如果手机处于横向,旋转角度将为90或-90。 因此,如果你想要正确的读数,你必须在调用getOrientation之前调用remapCoordinateSystem。