Androidアプリ センサーの値を取得する [Androidアプリ開発]
Android端末用のアプリといえば、なんといってもセンサーでしょう。今日はセンサーから値の取得をやってみよう。
センサーはイベントとして通知される。イベントをもらうためにSensorEventListenerインターフェースを実装しなければならない。
新しくクラスを作ってもよいが、既存のアクティビティクラスを使うことにする。
HelloAndroidクラスに、implements SensorEventListenerを加える。
赤線が出るので、クイック・フィックスする。eclipseにより、自動的に実装すべきメソッドが追加される(eclipseは便利だなぁ)。
onSensorChangedがセンサーの値が変化したときに呼び出されるコールバック。
onAccuracyChangedはよくわからないので何も処理しないでほっておく。
センサーの値は、onSensorChangedの引数eventに渡ってくる。
SensorEventクラスにはいくつかプロパティがあるが、センサーの値は、valuesで取得できる。valuesはfloat型の配列。いくつかのセンサーは3次元での座標値を戻すので、要素数が3となっている。
どういった値が渡ってくるのか確認するため、ログに出力してみよう。
この状態で一度実行してみよう。
センサーの値がLogCatに表示されるだろうか...
多分、失敗する。
onTouchEventは単にオーバーライドするだけでOKであったが、onSensorChangedはリスナータイプなので、登録が必要になる。
リスナーの登録はちょっとめんどくさい。まず、SensorManagerなるものをシステムから取得する。
次に、SensorManagerからセンサーのリストを取得する。端末にたくさんのセンサーが付いているかも知れないので、使いたいセンサーを選別してリスナーを登録する。センサーリストの取得は、SensorManager#getSensorListで行う。
getSensorListを呼び出す際に、引数でセンサーのタイプを指定できる。センサーのタイプは、Sensorクラスにfinal intで定義されている。その一部を紹介すると...
Sensor.TYPE_ALL すべてのセンサー
Sensor.TYPE_ACCELEROMETER 加速度センサー
Sensor.TYPE_LIGHT 照度センサー
詳細は、Sensorクラスのドキュメントを参照。
getSensorListはListを戻す。このリストに入っているのはSensorオブジェクトになる。Java的に書くとList<Sensor>。各要素について、SensorManagerのregisterListenerを呼び出して、リスナーを登録する。登録の解除は、unregisterListenerで行うことができる。
なんとなくわかったような。実際にやってみればもっとよくわかるが、ひとつ問題が。
どこで登録すればよいかといった問題である。
Android端末は、モバイルである場合が多い。バッテリーはなるべく使わない方がよい。センサーを使うのも最小限にした方がいいに決まっている。
消費電力を抑えるため、端末はすぐにスリープ状態に入ろうとする。このときアクティビティに状態の遷移が通知される。
また、Android端末はマルチプロセス、マルチスレッドで動作する。いくつものアクティビティを起動できるし、それらをバックグラウンドで実行することもできる。
センサーの値は、画面を操作しているときにしか必要ないであろう。フォアグラウンドで実行しているときにだけリスナーが登録されていればよい、ということになる。
アクティビティの状態遷移は、Activityクラスのドキュメントに載っている。これをよくみると。
アクティビティがフォアグラウンドになったときに、onResumeが呼び出される。ここでリスナー登録をすればよい。
バックグラウンドになったときは、onPauseが呼び出される。ここでリスナー解除すればよい。
では、やってみよう。
これで、LogCatに加速度センサーの値が出力されるはず。
ひとつ説明していなかった。registerListenerの3つ目の引数は、リスナーに通知する頻度を指定する。SENSOR_DELAY_NORMALは普通の頻度。
SENSOR_DELAY_FASTESTが最も頻繁に通知してくる。他に、SENSOR_DELAY_GAME、SENSOR_DELAY_UIがある。
getSystemService(SENSOR_SERVICE)がnullを戻す場合もあるかも知れない。エラーチェックは省略しているので、ちゃんとした売り物のアプリを開発するのであれば、さぼらずにnullチェックしておいた方がよいだろう。
サイト内を検索
センサーはイベントとして通知される。イベントをもらうためにSensorEventListenerインターフェースを実装しなければならない。
新しくクラスを作ってもよいが、既存のアクティビティクラスを使うことにする。
HelloAndroidクラスに、implements SensorEventListenerを加える。
赤線が出るので、クイック・フィックスする。eclipseにより、自動的に実装すべきメソッドが追加される(eclipseは便利だなぁ)。
onSensorChangedがセンサーの値が変化したときに呼び出されるコールバック。
onAccuracyChangedはよくわからないので何も処理しないでほっておく。
センサーの値は、onSensorChangedの引数eventに渡ってくる。
SensorEventクラスにはいくつかプロパティがあるが、センサーの値は、valuesで取得できる。valuesはfloat型の配列。いくつかのセンサーは3次元での座標値を戻すので、要素数が3となっている。
どういった値が渡ってくるのか確認するため、ログに出力してみよう。
public class HelloAndroid2Activity extends Activity implements SensorEventListener { @Override public void onAccuracyChanged(Sensor sensor, int accuracy) { } @Override public void onSensorChanged(SensorEvent event) { android.util.Log.d("onSensorChanged", event.values[0] + "," + event.values[1] + "," + event.values[2]); } }
この状態で一度実行してみよう。
センサーの値がLogCatに表示されるだろうか...
多分、失敗する。
onTouchEventは単にオーバーライドするだけでOKであったが、onSensorChangedはリスナータイプなので、登録が必要になる。
リスナーの登録はちょっとめんどくさい。まず、SensorManagerなるものをシステムから取得する。
次に、SensorManagerからセンサーのリストを取得する。端末にたくさんのセンサーが付いているかも知れないので、使いたいセンサーを選別してリスナーを登録する。センサーリストの取得は、SensorManager#getSensorListで行う。
getSensorListを呼び出す際に、引数でセンサーのタイプを指定できる。センサーのタイプは、Sensorクラスにfinal intで定義されている。その一部を紹介すると...
Sensor.TYPE_ALL すべてのセンサー
Sensor.TYPE_ACCELEROMETER 加速度センサー
Sensor.TYPE_LIGHT 照度センサー
詳細は、Sensorクラスのドキュメントを参照。
getSensorListはListを戻す。このリストに入っているのはSensorオブジェクトになる。Java的に書くとList<Sensor>。各要素について、SensorManagerのregisterListenerを呼び出して、リスナーを登録する。登録の解除は、unregisterListenerで行うことができる。
なんとなくわかったような。実際にやってみればもっとよくわかるが、ひとつ問題が。
どこで登録すればよいかといった問題である。
Android端末は、モバイルである場合が多い。バッテリーはなるべく使わない方がよい。センサーを使うのも最小限にした方がいいに決まっている。
消費電力を抑えるため、端末はすぐにスリープ状態に入ろうとする。このときアクティビティに状態の遷移が通知される。
また、Android端末はマルチプロセス、マルチスレッドで動作する。いくつものアクティビティを起動できるし、それらをバックグラウンドで実行することもできる。
センサーの値は、画面を操作しているときにしか必要ないであろう。フォアグラウンドで実行しているときにだけリスナーが登録されていればよい、ということになる。
アクティビティの状態遷移は、Activityクラスのドキュメントに載っている。これをよくみると。
アクティビティがフォアグラウンドになったときに、onResumeが呼び出される。ここでリスナー登録をすればよい。
バックグラウンドになったときは、onPauseが呼び出される。ここでリスナー解除すればよい。
では、やってみよう。
protected void onPause() { // Listenerの登録解除 SensorManager sm = (SensorManager)getSystemService(SENSOR_SERVICE); sm.unregisterListener(this); super.onPause(); } protected void onResume() { SensorManager sm = (SensorManager)getSystemService(SENSOR_SERVICE); // 加速度センサーを取得 List<Sensor> sensors = sm.getSensorList(Sensor.TYPE_ACCELEROMETER); for ( Sensor s :sensors ) { sm.registerListener(this, s, SensorManager.SENSOR_DELAY_NORMAL); } super.onResume(); }
これで、LogCatに加速度センサーの値が出力されるはず。
ひとつ説明していなかった。registerListenerの3つ目の引数は、リスナーに通知する頻度を指定する。SENSOR_DELAY_NORMALは普通の頻度。
SENSOR_DELAY_FASTESTが最も頻繁に通知してくる。他に、SENSOR_DELAY_GAME、SENSOR_DELAY_UIがある。
getSystemService(SENSOR_SERVICE)がnullを戻す場合もあるかも知れない。エラーチェックは省略しているので、ちゃんとした売り物のアプリを開発するのであれば、さぼらずにnullチェックしておいた方がよいだろう。
かんたんAndroidアプリ作成入門 (プログラミングの教科書)
- 作者: 朝井 淳
- 出版社/メーカー: 技術評論社
- 発売日: 2013/04/16
- メディア: 単行本(ソフトカバー)
サイト内を検索
2012-01-23 11:06
nice!(0)
コメント(0)
Copyright Atsushi Asai Google+朝井淳
[データベースの気持ちがわかる]SQLはじめの一歩 (WEB+DB PRESS plus)
- 作者: 朝井 淳
- 出版社/メーカー: 技術評論社
- 発売日: 2015/03/03
- メディア: 単行本(ソフトカバー)
Access クエリ 徹底活用ガイド ~仕事の現場で即使える
- 作者: 朝井 淳
- 出版社/メーカー: 技術評論社
- 発売日: 2018/05/25
- メディア: 大型本
コメント 0