2

デバイスのコンパスの角度をファイルに記録するAndroidアプリケーションを構築しています。この学位を取得するには、次の2つの方法があります。

方法1:

SensorManager mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
Sensor orientationSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION);
mSensorManager.registerListener(this, orientationSensor, SensorManager.SENSOR_DELAY_NORMAL);


public void onSensorChanged(SensorEvent event) {
    float azimuthInDegrees = event.values[0]
}

方法2:

SensorManager mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
Sensor accelerometer = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
Sensor magnetometer = mSensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);
mSensorManager.registerListener(this, accelerometer, SensorManager.SENSOR_DELAY_NORMAL);
mSensorManager.registerListener(this, magnetometer, SensorManager.SENSOR_DELAY_NORMAL);

float[] mGravity;
float[] mGeomagnetic;

public void onSensorChanged(SensorEvent event) {
    if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
       mGravity = event.values;
    }


    if (event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD) {
        mGeomagnetic = event.values;
    }

    if (mGravity != null && mGeomagnetic != null) {
        float R[] = new float[9];
        float I[] = new float[9];
        boolean success = SensorManager.getRotationMatrix(R, I, mGravity, mGeomagnetic);
        if (success) {
            float orientation[] = new float[3];
            SensorManager.getOrientation(R, orientation);   

            float azimuthInDegress = ((float) Math.toDegrees(orientation[0]) + 360) % 360;
        }
    }
}

デバイスを北方向(約360度)に配置して、両方の方法を試しました。

方法1は完全な結果を返しますが、残念ながらこの方法は非推奨です。

  • 359.6567
  • 359.5034
  • 359.859
  • 359.76212
  • 359.8878
  • 359.87048
  • 359.8356
  • 359.80356
  • 359.81192
  • 359.7671
  • 359.84668
  • 359.88528

方法2も良好な結果を返しますが、場合によっては(ランダムに)誤った次数を返します。

  • 359.91495
  • 359.83652
  • 263.67697
  • 359.67993
  • 359.70038
  • 359.688
  • 359.71155
  • 359.70276
  • 359.6984
  • 359.6429
  • 270.6323
  • 359.62302
  • 359.49954
  • 359.44757
  • 359.47803
  • 359.4947
  • 359.39572

ご覧のとおり、2番目の方法では、いくつかの誤った度がランダムに返されます。デバイスはキャリブレーションされており、最初の方法では完璧な結果が返されるため、問題は2番目の方法にあると思います。助けてくれませんか?

4

1 に答える 1

3

問題はの割り当てにmGravityあり、mGeomagneticそうあるべきですevent.values.clone()。mGravityにはクラススコープがありますが、mGravity = event.valuesを使用して、メソッドスコープを持つアドレスの値にその値を割り当てます。したがって、onSensorChangedが再度呼び出され、それが磁気タイプであるとすぐに、mGravityは、存在しなくなったため、任意の値を持つことができる変数を指していることになります。

于 2013-03-25T19:30:27.330 に答える