Androidデバイスの方位を調べる
デバイスの方位を調べるには
加速度センサー、磁気センサーを使い
包囲角度を計算する
そして、東西南北どの方位に該当するかを計算し、方位を求めることになる
まず、SensorManagerのインスタンス取得
mSensorManager = (SensorManager)getSystemService(SENSOR_SERVICE);
次に、センサーの登録
これは、
SensorManagerクラスの
registerListener()を使い加速度センサー、および磁気センサーを登録する
@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()で
加速度センサー、および磁気センサーを解除する
@Override public void onPause(){ //センサー解除 mSensorManager.unregisterListener(this); super.onPause(); }
次に、方位角度を求める
これは、センサーで取得した値から方位角度を計算することで求められる
@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()で行うようにする