aleph_null ソリューションの実装に成功しました。ここで、受け入れられたソリューションに記載されていない詳細をいくつか追加します。
上記のソリューションを機能させるには、android.hardware.SensorEventListener インターフェイスを実装する必要があります。
また、次のように onResume および onPause メソッドで SensorEventListener に登録する必要があります。
@Override
protected void onResume() {
super.onResume();
mSensorManager.registerListener(this,
mRotVectSensor,
SensorManager.SENSOR_STATUS_ACCURACY_LOW);
}
@Override
protected void onPause() {
// unregister listener
super.onPause();
mSensorManager.unregisterListener(this);
}
「@Bytecode」への注意: ちらつきを避けるために、SensorManager.SENSOR_STATUS_ACCURACY_LOW のように、サンプリング期間に低い値を使用します。
また、センサーがデバイスが処理できるよりも多くのデータを送信することにも気付きました。その結果、マップ カメラが奇妙な方向に動き始めます。
onSensorChanged によって処理されるデータの量を制御するには、次の実装をお勧めします。
@Override
public void onSensorChanged(SensorEvent event) {
if(event.sensor.getType() == Sensor.TYPE_ROTATION_VECTOR) {
SensorManager.getRotationMatrixFromVector(
mRotationMatrix, event.values);
float[] orientation = new float[3];
SensorManager.getOrientation(mRotationMatrix, orientation);
if (Math.abs(Math.toDegrees(orientation[0]) - angle) > 0.8) {
float bearing = (float) Math.toDegrees(orientation[0]) + mDeclination;
updateCamera(bearing);
}
angle = Math.toDegrees(orientation[0]);
}
}