ケルベロスさんのプログラミング / けるぷろ

プログラマのけるさんことケルベロスです

Android端末のセンサーを扱う

Android端末のセンサーを扱う

使用可能なセンサーリストを取得する

SensorManagerを使用する

/* ActivityのインスタンスからSensorManagerを取得 */
SensorManager manager = (SensorManager) activity.getSystemService(Context.SENSOR_SERVICE);

/* getSensorListの引数にSensor.TYPE_ALLでリストを取得 */
List<Sensor> sensors = manager.getSensorList(Sensor.TYPE_ALL);

for (Sensor sensor : sensors) {
    Log.d("Sensor","name:" + sensor.getName() + " type:" + String.valueOf(sensor.getType()));
}

↓実行結果 (Nexsus9 Android7.0)

name:Accelerometer Sensor type:1
name:Magnetic field Sensor type:2
name:Gyroscope Sensor type:4
name:CM32181 Light sensor type:5
name:Pressure Sensor type:6
name:CWGD Orientation Sensor type:3
name:Rotation Vector type:11
name:Linear Acceleration type:10
name:Gravity type:9
name:Magnetic Uncalibrated type:14
name:Gyroscope Uncalibrated type:16
name:Game Rotation Vector type:15
name:Geomagnetic Rotation Vector type:20
name:Significant Motion type:17
name:Step Detector type:18
name:Step Counter type:19
name:Accelerometer Sensor (WAKE_UP) type:1
name:Magnetic field Sensor (WAKE_UP) type:2
name:Gyroscope Sensor (WAKE_UP) type:4
name:Pressure Sensor (WAKE_UP) type:6
name:CWGD Orientation Sensor (WAKE_UP) type:3
name:Rotation Vector (WAKE_UP) type:11
name:Linear Acceleration (WAKE_UP) type:10
name:Gravity (WAKE_UP) type:9
name:Magnetic Uncalibrated (WAKE_UP) type:14
name:Gyroscope Uncalibrated (WAKE_UP) type:16
name:Game Rotation Vector (WAKE_UP) type:15
name:Geomagnetic Rotation Vector (WAKE_UP) type:20
name:Step Detector (WAKE_UP) type:18
name:Step Counter (WAKE_UP) type:19

Android7.0のNexsus9で検証
加速度(Acceleromenter)、磁場(Magnetic field)、ジャイロスコープ(Gyroscope)、光(CM32181 Light)、気圧(Pressure)、等のセンサーが使用できる
WAKE_UPというのはセンサー取得時にgetDefaultSensorの引数wakeUpのところにtrueを入れれはwake_upセンサーを取得できる

Sensorクラスについて

/*タイプ SensorManagerのgetDefaultSensorの引数に使用する*/
public int getType(){}  
/*センサーの名前を取得 */
public String getName(){}  

getTypeで取得できるタイプはSensorクラスに定義されている
public static final int TYPE_ACCELEROMETER = 1;
public static final int TYPE_MAGNETIC_FIELD = 2;
public static final int TYPE_GYROSCOPE = 4;

センサーの名前は英語で取得できる(上記実行結果)

加速度センサーを使用して値を取得する流れ (Accelerometer Sensor)

/* ActivityのインスタンスからSensorManagerを取得 */
SensorManager manager = (SensorManager) activity.getSystemService(Context.SENSOR_SERVICE);
/* 加速度センサーを取得 */
Sensor accelerometerSensor = manager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
/* SensorManagerにリスナー、加速度センサーインスタンス、サンプリング回数を引数として、センサーを登録する */
/*(thisのクラスにSensorEventListenerをimplementsしておく)*/
manager.registerListener(this,accelerometerSensor,SensorManager.SENSOR_DELAY_NORMAL);

/* センサーの値が更新されると以下メソッドに値が入ってくる */
@Override
public void onSensorChanged(SensorEvent sensorEvent) {
    float[] values = sensorEvent.values;
    float x = values[0]; // values配列の0番目の値はX軸の加速度 単位(m/s^2)
    float y = values[1]; // values配列の1番目の値はY軸の加速度 単位(m/s^2)
    float z = values[2]; // values配列の2番目の値はZ軸の加速度 単位(m/s^2)
}

加速度センサーのTYPEの値はSensor.TYPE_ACCELEROMETER
サンプリング回数はSensorManagerクラスに
SENSOR_DELAY_FASTEST = 0; (3-30ms)
SENSOR_DELAY_GAME = 1; (3-30ms)
SENSOR_DELAY_NORMAL = 3; (約200ms)
SENSOR_DELAY_UI = 2; (約60ms)
と定義されている

参考: http://masterka.seesaa.net/article/180418713.html

SensorManagerクラスについて

/*センサーリストを取得する*/
public List<Sensor> getSensorList(int type){}

/*センサーインスタンスを取得する*/
public Sensor getDefaultSensor(int type){}

/*センサーを登録する */
public boolean registerListener(SensorEventListener listener, Sensor sensor, int samplingPeriodUs){}

/*センサーを登録解除する sensor引数なしならばlistenerの全てのセンサーの登録解除*/
public void unregisterListener(SensorEventListener listener, Sensor sensor){}

/*リスナの定義 */
public interface SensorEventListener {
    /*センサー値変更時*/
    /*var1.valuesで値の配列を取得*/
    void onSensorChanged(SensorEvent var1);
    /*センサーの正確さ変更時*/
    void onAccuracyChanged(Sensor var1, int var2);
}

getSensorListの引数にはSensorクラスで定義されているSensor.TYPE_ALLを入れれば全センサーを取得できる
基本的にはActivityのonPauseでunregisterListenerを呼び出してセンサーの処理を止める
しかし、止めなければアプリがバックグラウンド状態でも値の取得が可能(端末を傾けたらアプリ内で処理を実行する等が可能)

サンプルプロジェクト

センサーを使用するサンプルプロジェクトをgithubに置いたので参考にしていただければと思います。
https://github.com/rdme/AndroidSensorSample