次のようにコードを実装しました。
//register sensor in OnResume
mSensorManager.registerListener(this, accelerometer, SensorManager.SENSOR_DELAY_UI);
mSensorManager.registerListener(this, magnetometer, SensorManager.SENSOR_DELAY_UI);
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);
azimuth = (int)( Math.toDegrees( orientation[0] ) + 0.5 ); // orientation contains: azimuth, pitch and roll
pitch = (int)( Math.toDegrees( orientation[1] ) + 0.5 );
roll = (int)( Math.toDegrees( orientation[2] ) + 0.5 );
// output azimuth, pitch and roll
}
}
}
上記のコードは、Galaxy Nexus セルでは正常に動作しますが、nexus タブレットでは問題があります (方位角、ピッチ、ロールの更新がうまく応答せず、5 ~ 8 秒かかる場合があります)。
OnSensorChanged() の呼び出しが正常に機能していることを確認しましたが、「if(success)」テストが常に成功するとは限らず、この問題が発生します。
ブール変数「成功」を出力してテストしました:
- Galaxy Nexus では、false と true の比率は約 1:1 です。
- Nexus タブレットでは、false と true の比率が大きく異なり、20 : 1 を超えることもあります。
どんな助けでも大歓迎です。