Android - SensorManager странное поведение getOrientation - PullRequest
5 голосов
/ 07 июля 2010

Мне нужно восстановить ориентацию моего телефона. На данный момент я написал это:

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], которое представляет собой вращение на оси zed, как описано [здесь] [1], значение увеличивается, хотя вращения не было.

Кто-то знал, что происходит?

EDIT

Еще одна странная вещь ..

Я попробовал свое приложение в офисе на работе, и у него было странное поведение, которое я описал ранее ... Я попробовал в том же офисе (та же самая ситуация) приложение компаса, которое я взял с рынка, и у меня такое же поведение ... Когда я переместил телефон вверх, значение изменилось последовательно ... Я попробовал в том же офисе (та же самая ситуация) компас i-phone, и у него не было такого странного поведения!

Затем, когда я приехал домой, я попробовал оба, мое приложение и приложение компаса на моем телефоне с Android, и они работали !! даже если я перемещаюсь вверх по телефону, значение стабильно ...

Большое спасибо.

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

Ответы [ 2 ]

4 голосов
/ 24 августа 2010

Оценка ориентации, полученная устройством, частично зависит от локального направления магнитного поля.В зданиях, вблизи железных конструкций и вблизи электрических приборов измеренное магнитное поле может значительно различаться на расстояниях, измеряемых в футах.Этот эффект можно легко увидеть с помощью ручного магнитометра или гауссметра.

Я подозреваю, что эти искажения являются причиной странного поведения ваших приложений.

1 голос
/ 31 марта 2012

Когда вы поднимаете его, вы вводите угол поворота, и это влияет на возвращаемые значения в getOrientation.Угол поворота измеряет величину поворота вашего устройства из нормального положения, то есть для большинства устройств, где нормальное положение означает «Портрет», тогда, если телефон находится в горизонтальной ориентации, угол поворота будет 90 или -90.Поэтому, если вам нужно правильное чтение, вы должны вызвать remapCoordinateSystem перед вызовом getOrientation.

...