Androidには端末に搭載された各種のセンサー機能を利用するためのAPIが提供されています。
このAPIを利用することで、安易にセンサーから値を取得することができる仕組みとなっているのです。
Androidでサポートしているセンサー類は3種に分類することができます。
● モーションセンサー
加速度センサー、重力センサー、ジャイロスコープなどがモーションセンサーに該当します。
● 環境センサー
気圧センサー、照度センサー、温度センサーなどが環境センサーに該当します。
● 位置センサー
傾きセンサー、地磁気センサーなどが位置センサーに該当します。
これらのセンサーを利用するアプリケーションを作成するためには、Androidのセンサー・フレームワークを使用する必要があります。
センサー・フレームワークには便利なクラス・インターフェース群が定義されています。
※注意※
エミュレーターはセンサー機能に対応していないため、このCHAPTERのサンプルプログラムは実機で実行してください。
また、機種ごとに実装が(APIから取得できる値が)異なり、かつ搭載されているセンサーも機種ごとに異なるため、注意する必要があります。
まず、センサー・フレームワークの中に定義されているクラス・インタフェースを紹介します。
これらのクラス・インタフェースはandroid.hardwareパッケージに属しています。
クラス/インターフェース名 | 概要 |
---|---|
Sensor | 各種センサー機器に共通する属性(名前、センサー種類、開発ベンダー、バージョン番号等)を管理するセンサー自身を表したクラス。 |
SensorManager | センサーにアクセスするためのクラス。このクラスのオブジェクトを用いてイベントリスナーの登録/削除、センサー情報の取得等を行う。 |
SensorEvent | センサーで発生した情報をまとめたクラス。 |
SensorEventListener | センサー関連のイベントを取得するためのイベントリスナー。SensorManagerクラスで登録/削除を行う。 |
Senserクラスは、センサー自身を表したクラスです。例えば3つのセンサーを搭載しているAndroid端末では、このクラスから作成したオブジェクトが3つ存在するイメージです。
SenserManagerクラスは、Senserオブジェクトを取得したり、そのオブジェクトに対してイベントリスナーを登録する際に使用します。
SenserEventクラスは、センサーで発生した情報をまとめたクラスです。センサーの種類によって取得できる値が違う(あるセンサーでは3次元ベクトルの値を、またあるセンサーでは1つの値(温度など)を取得する)ため、それらの違いを吸収したり、発生した時間や値の精度を保持するためのクラスです。
SenserEventListenerインタフェースは、センサー関連のイベントをハンドリングし、センサーが測定した値を取得するためのコールバックメソッドを定義しています。SenserManagerクラスをメソッドを使用し、リスナーとしての登録することができます。。
では実際にセンサーから値を取得するための手順に沿って、センサー・フレームワークの使用方法を紹介します。
1. getSystemService()メソッドを使用し、 SensorManagerオブジェクトを取得する
2. SensorManagerオブジェクトから使用したいSensorオブジェクトを取得する
3. SensorEventListenerインターフェースを実装したクラスを作成・インスタンス化し、イベントリスナーとして登録する
4. センサーでイベントが発生すると、イベントリスナーとして登録したSensorEventListenerのコールバックメソッドが実行され、センサーで取得した値がSenserEventオブジェクトとして引数として渡される
5. 不要となったリスナーは解除する
private SensorManager sensorManager; // ...省略... sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
getSystemService()メソッドはContextクラスで定義されているメソッドです。ActivityクラスやServiceクラスでは上記のように使用することができます。
引数にはStringを渡しますが、一般にはContextクラスに定義されている定数を使います。SENSOR_SERVICEを引数に渡すことでSensorManagerオブジェクトを取得することができます。
戻り値はObjectクラスのため、キャストする必要があります。