Androidデバイスの方位を調べる
デバイスの方位を調べるには
加速度センサー、磁気センサーを使い
包囲角度を計算する
そして、東西南北どの方位に該当するかを計算し、方位を求めることになる
まず、SensorManagerのインスタンス取得
1 | mSensorManager = (SensorManager)getSystemService(SENSOR_SERVICE); |
次に、センサーの登録
これは、
SensorManagerクラスの
registerListener()を使い加速度センサー、および磁気センサーを登録する
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | @Override protected void onResume(){ super .onResume(); mSensorManager.registerListener( this , mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), SensorManager.SENSOR_DELAY_UI); mSensorManager.registerListener( this , SensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD), SensorManager.SENSOR_DELAY_UI); } |
次に、センサーの解除について
これは、SensorManagerの
unregisterListener()で
加速度センサー、および磁気センサーを解除する
1 2 3 4 5 6 7 | @Override public void onPause(){ //センサー解除 mSensorManager.unregisterListener( this ); super .onPause(); } |
次に、方位角度を求める
これは、センサーで取得した値から方位角度を計算することで求められる
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 | @Override public void onSensorChanged(SensorEvent event){ switch (event.sensor.getType()){ //加速度センサーの値取得 case Sensor.TYPE_ACCELEROMETER: mAcMatrix = event.values.clone(); break ; //磁気センサーの値取得 case Sensor.TYPE_MAGNETIC_FIELD: mMgMatrix = event.values.clone(); break ; } if (mMgMatrix != null && mAcMatrix != null ){ float [] orientation = new float [ 3 ]; float R[] = new float [ 16 ]; float I[] = new float [ 16 ]; //加速度センサー、磁気センサーの値を元に、回転行列を計算する SensorManager.getRotationMatrix(R, I, mAcMatrix, mMgMatrix); //デバイスの向きに応じて回転行列を計算する SensorManager.getOrientation(R, orientation); //ラジアンから角度へ変換 float angle = ( float )Math.floor(Math.toDegrees(orientation[ 0 ])); //角度の範囲を0~360度へ調整 if (angle >= 0 ){ orientation[ 0 ]=angle; } else if (angle < 0 ){ orientation[ 0 ]= 360 + angle; } //得られた角度を画面へ表示 mTVAzimuth.setText(String.valueOf(orientation[ 0 ])); } |
このように、Androidでは
方位角を求めるには、
加速度センサーと磁気センサーを併用し
加速度の値
磁気センサーの値
デバイスの向きを元に回転行列を作成する
その後で、該当するラジアン値を角度へ変換することで
方位角を求めることができる
注意点として、センサーは一度登録すると解除するまで作動するため
バッテリー消費が激しくなる
このため、登録にはonPause()
解除には onResume()で行うようにする