SSブログ

Androidアプリ センサーの値を取得する [Androidアプリ開発]

Android端末用のアプリといえば、なんといってもセンサーでしょう。今日はセンサーから値の取得をやってみよう。

センサーはイベントとして通知される。イベントをもらうために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>。各要素について、SensorManagerregisterListenerを呼び出して、リスナーを登録する。登録の解除は、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アプリ作成入門 (プログラミングの教科書)

かんたんAndroidアプリ作成入門 (プログラミングの教科書)

  • 作者: 朝井 淳
  • 出版社/メーカー: 技術評論社
  • 発売日: 2013/04/16
  • メディア: 単行本(ソフトカバー)





サイト内を検索

nice!(0)  コメント(0) 

nice! 0

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。



Copyright Atsushi Asai Google+朝井淳
[改訂第4版]SQLポケットリファレンス

[改訂第4版]SQLポケットリファレンス

  • 作者: 朝井 淳
  • 出版社/メーカー: 技術評論社
  • 発売日: 2017/02/18
  • メディア: 単行本(ソフトカバー)

イラストで理解 SQL はじめて入門

イラストで理解 SQL はじめて入門

  • 作者: 朝井 淳
  • 出版社/メーカー: 技術評論社
  • 発売日: 2019/05/16
  • メディア: 単行本(ソフトカバー)

[データベースの気持ちがわかる]SQLはじめの一歩 (WEB+DB PRESS plus)

[データベースの気持ちがわかる]SQLはじめの一歩 (WEB+DB PRESS plus)

  • 作者: 朝井 淳
  • 出版社/メーカー: 技術評論社
  • 発売日: 2015/03/03
  • メディア: 単行本(ソフトカバー)

Access クエリ 徹底活用ガイド ~仕事の現場で即使える

Access クエリ 徹底活用ガイド ~仕事の現場で即使える

  • 作者: 朝井 淳
  • 出版社/メーカー: 技術評論社
  • 発売日: 2018/05/25
  • メディア: 大型本

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。