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