5

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

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],即 [here][1] 所述的 zed 轴上的旋转,尽管没有旋转,但该值会增加。

有人知道会发生什么吗?

编辑

另一个奇怪的事情..

我在办公室尝试了我的应用程序,它有我之前描述的奇怪行为..我在同一个办公室(相同情况)尝试了我从市场上购买的指南针应用程序,它与我的行为相同..当我将手机向上移动,值一直在变化。我在同一个办公室(相同情况)尝试了 i-phone 指南针,它没有那种奇怪的行为!

然后当我到家时,我尝试了我的应用程序和我的安卓手机的指南针应用程序,它们都工作了!!即使我向上移动手机,价值也是稳定的......

非常感谢。

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

4

2 回答 2

4

设备获得的方向估计部分取决于局部磁场方向。在建筑物内、铁结构附近和电器附近,感应到的磁场可能会随着以英尺为单位的距离而显着变化。使用手持式磁力计或高斯计可以很容易地看到这种效果。

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

于 2010-08-23T21:02:54.700 回答
1

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

于 2012-03-31T00:01:53.607 回答