Androidデバイスの方位を調べる

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()で行うようにする

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です