【Android】加速度センサーを使ってx軸、y軸、z軸の加速度を取得する方法


概ねタイトル通りです。
加速度って何?という方もいらっしゃるかもしれませんが、
要は端末を上下左右にビュンビュン振ったとして、どの方向にどれくらい振ったのか調べられる機能です(^ω^)

この機能はエミュレータでは利用できないのでアンドロイド端末が必須となります。



Androidで使用出来る様々なセンサー


Androidには色々な種類のセンサが使えるようになっています。
例)
  • 加速度センサー
  • 地磁気センサー
  • 傾きセンサー
  • ジャイロセンサー
  • 温度センサー
賢いですね、さすがドロイド君かしこい。

今回はその中にある「加速度センサー」を使ってみます。

SensorManagerインスタンスを取得してイベントを登録する


流れとしては
・getSystemServiceでSensorManagerを取得
・SensorManagerから加速度センサーを取得
・イベントを登録
といった感じだと思います。

インポートするのは以下の4行です。
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;



SensorManagerインスタンス取得とイベントリスナを登録の例です。
加速度センサは TYPE_ACCELEROMETER 、
アクセロメーター(加速度計)という定数を使って取得します。
SensorManager manager = (SensorManager)getSystemService(SENSOR_SERVICE);
Sensor sensor         = manager.getDefaultSensor( Sensor.TYPE_ACCELEROMETER );
manager.registerListener( 【イベントリスナー】 , sensor, SensorManager.SENSOR_DELAY_NORMAL );



上記の【イベントリスナー】の部分には、
SensorEventListenerインターフェースを実装したクラスを用意します。
class SampleSensorEventListener implements SensorEventListener{
  @Override
  public void onSensorChanged(SensorEvent e) {
  	if(e.sensor.getType() == Sensor.TYPE_ACCELEROMETER ){
      /* 加速度センサを取得する処理 */
  	}
  }
}


加速度の値は、SensorEvent e の次のフィールドを使って取得します。
e.values[0]X軸方向の加速度(左右方向 右方向が正)
e.values[1]Y軸方向の加速度(上下方向 上方向が正)
e.values[2]Z軸方向の加速度(前後方向 前面方向が正)

サンプルプログラム


import android.app.Activity;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.widget.LinearLayout;
import android.widget.TextView;

public class Sample20120704Activity extends Activity {

	private SensorManager       manager;
	private Sensor              sensor;
	private SensorEventListener sample_listener;

    TextView tv_x;
    TextView tv_y;
    TextView tv_z;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        LinearLayout ll = new LinearLayout(this);
        ll.setOrientation(LinearLayout.VERTICAL);
        setContentView( ll );
        tv_x = new TextView(this);
        tv_y = new TextView(this);
        tv_z = new TextView(this);
        ll.addView(tv_x);
        ll.addView(tv_y);
        ll.addView(tv_z);

        sample_listener = new SampleSensorEventListener();
    }
    @Override
    protected void onResume(){
    	super.onResume();
    	manager = (SensorManager)getSystemService(SENSOR_SERVICE);
    	sensor  = manager.getDefaultSensor( Sensor.TYPE_ACCELEROMETER );
    	manager.registerListener(sample_listener, sensor, SensorManager.SENSOR_DELAY_NORMAL );
    }
    @Override
    protected void onPause(){
    	super.onPause();
    	manager.unregisterListener(sample_listener);
    }

    class SampleSensorEventListener implements SensorEventListener{

		@Override
		public void onSensorChanged(SensorEvent e) {
			if(e.sensor.getType() == Sensor.TYPE_ACCELEROMETER ){
				String str_x = "X軸の加速度:" + e.values[0];
				tv_x.setText( str_x );
				String str_y = "Y軸の加速度:" + e.values[1];
				tv_y.setText( str_y );
				String str_z = "Z軸の加速度:" + e.values[2];
				tv_z.setText( str_z );
			}
		}

		@Override
		public void onAccuracyChanged(Sensor arg0, int arg1) {
		}

    }

}



【実行結果】
加速度センサーを取得するサンプルプログラム実行結果


関連記事

【Android】加速度センサーを使ってx軸、y軸、z軸の加速度を取得する方法” への1件のコメント

  1. ピンバック: 【Andoird】サンプルアプリ第2弾「巫女さんおみくじ」公開しました | 桜花満開