久しぶりに軽くAndroidでSensorManager

久しぶりのBlogを更新。今まで何をやっていたかというと、業務が開発と離れていたためサボっていました...。ということで、久しぶりに地道に頑張ってBlog更新して行こうかと思います。ということで、今回は軽めにSensorManagerから加速度センサーを取得し、各軸の加速度をTextViewに表示してみたいと思います。

やりたいこと

  1. SensorManagerを取得する
  2. 加速度センサーのSensorオブジェクトを取得する
  3. 加速度を取得する

こんな感じで加速度を表示

実装の要点を下記にまとめます

1. SensorMangerを取得

SensorManager manager = (SensorManager)getSystemService(Context.SENSOR_SERVICE);

2. 加速度センサーを取得

Sensor ac = manager.getSensorList(Sensor.TYPE_ACCELEROMETER).get(0);

3. 加速度センサーにSensorEventListerを登録

manager.registerListener(this, ac, SensorManager.SENSOR_DELAY_GAME)

4. SensorEventListener#onSensorChanged()内で加速度を取得

        @Override
	public void onSensorChanged(SensorEvent event) {
		mBuilder.setLength(0);
		mBuilder.append("x: ");
		//values[0]にはx軸の加速度
		mBuilder.append(event.values[0]);
		mBuilder.append(", y: ");
		//values[1]にはy軸の加速度
		mBuilder.append(event.values[1]);
		mBuilder.append(", z: ");
		//values[2]にはz軸の加速度
		mBuilder.append(event.values[2]);
		mTextView.setText(mBuilder.toString());
	}

では実装です

SensorEventListenerを実装したActivity

package com.android.example;

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

public class AccelerometerTest extends Activity implements SensorEventListener {
	
	private static final String TAG = AccelerometerTest.class.getSimpleName();
	
	private TextView mTextView;
	private StringBuilder mBuilder = new StringBuilder();
    
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mTextView= new TextView(this);
        setContentView(mTextView);
        
        //SensorMangerを取得
        SensorManager manager = (SensorManager)getSystemService(Context.SENSOR_SERVICE);
        
        //SensorManagerオブジェクトを使ってDeviceに加速度センサーがあるか確認
        if(manager.getSensorList(Sensor.TYPE_ACCELEROMETER).size() == 0){
        	mTextView.setText("No accelerometer");
        }else{
        	//SensorManagerオブジェクトを使ってDeviceの加速度センサーを取得
        	Sensor ac = manager.getSensorList(Sensor.TYPE_ACCELEROMETER).get(0);
        	
        	//SensorManagerオブジェクトを使ってSensorListnerを加速度センサーに登録
        	if(!manager.registerListener(this, ac, SensorManager.SENSOR_DELAY_GAME)){
        		mTextView.setText("Couldn't register a listener");
        	}
        }
    }
    
    //センサーの精度が変わった時にコールバックされる
    //無視してOK
    @Override
    public void onAccuracyChanged(Sensor sensor, int accuracy) {
    	//Do nothing
    }
	
    //センサーの状態が変化した時にコールバックされる
    @Override
    public void onSensorChanged(SensorEvent event) {
 	mBuilder.setLength(0);
	mBuilder.append("x: ");
	//values[0]にはx軸の加速度
	mBuilder.append(event.values[0]);
	mBuilder.append(", y: ");
	//values[1]にはy軸の加速度
	mBuilder.append(event.values[1]);
	mBuilder.append(", z: ");
	//values[2]にはz軸の加速度
	mBuilder.append(event.values[2]);
	mTextView.setText(mBuilder.toString());
    }
}

と、こんな感じです。

HashTag #Java, #Android, #SensorManager, #SensorEventListener, #Sensor