Androidのセンサーを利用する


Androidでセンサーの値を取得する方法です。以前に紹介したセンサを使ってAndroid端末の傾きを知るとほぼ同じ手順です。今回紹介する照度センサーの動作は、傾きセンサーより単純なため、サンプルに向いた簡単な実装を紹介します。

センサ一覧(センサクラスの定数)

定数 説明
TYPE_ACCELEROMETER 加速度センサ
TYPE_ALL 全部のセンサを指定
TYPE_GYROSCOPE ジャイロスコープ
TYPE_LIGHT 照度センサ
TYPE_MAGNETIC_FIELD 地磁気センサ
TYPE_ORIENTATION 傾きセンサ(非推奨定数)
TYPE_PRESSURE 加圧センサ
TYPE_PROXIMITY 接近センサ
TYPE_TEMPERATURE 温度センサ

一覧で紹介したセンサーのうち

  • Sensor.TYPE_PROXIMITY (近接センサー)
  • Sensor.TYPE_LIGHT (環境光センサー)
  • Sensor.TYPE_TEMPERATURE (温度センサー)

などは今回のサンプルコードの一部を変えることで同様に扱えます。ぜひ試してみてください。

センサーマネージャの取得

1
2
3
4
5
6
7
8
9
10
11
12
13
/* センサーマネージャ */
private SensorManager mSensorManager;
private boolean mIsSensor;
 
/* Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
 
    /* センサーマネージャを取得する */
    mSensorManager=(SensorManager)getSystemService(Context.SENSOR_SERVICE);
}

照度センサーの登録

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
//* onResume */
@Override
protected void onResume() {
    super.onResume();
 
    // 照度センサー
    List<Sensor> sensors = mSensorManager.getSensorList(Sensor.TYPE_LIGHT);
 
    // センサマネージャへリスナーを登録(implements SensorEventListenerにより、thisで登録する)
    if (sensors.size() > 0) {
        Sensor sensor = sensors.get(0);
        mIsSensor = mSensorManager.registerListener(this,
            sensor,
            SensorManager.SENSOR_DELAY_FASTEST);
 
        /*
         * int  SENSOR_DELAY_FASTEST    get sensor data as fast as possible
         * int  SENSOR_DELAY_GAME       rate suitable for games
         * int  SENSOR_DELAY_NORMAL     rate (default) suitable for screen orientation changes
         * int  SENSOR_DELAY_UI         rate suitable for the user interface
         */
    }
}

ここで、7行目の引数を置き換えることで、様々なセンサの値が取得可能です。
近接センサー(TYPE_PROXIMITY)や、温度センサー(TYPE_TEMPERATURE)などが利用可能です。
ただし、機種やAndroidデバイスによっては搭載していない種類のセンサもあります。
10行目のようにセンサの数に注意して実装してください。
サンプルコードではsizeメソッドでセンサ数を確認してからリスナを登録しています。

値の取得

1
2
3
4
5
// 通知タイミングはSENSOR_DELAY_FASTEST、変化があり次第即座に反応します
public void onSensorChanged(SensorEvent event) {
 
    Log.v("Activity","Sensor.TYPE_LIGHT :" + String.valueOf(event.values[0]) ); //照度NexusOneの場合、10~10000程度で値が変わる
}

NexusOneの照度センサの場合、室内で200~640程度、環境光をさえぎるためにセンサを手で覆うと10にまで減りました。一方、LEDライトを近づけると10000に到達することもあります。今回はNexusOneで試しましたが、これらの数字は機種ごとに異なる可能性もあるので一つの目安としてみてください。最終的には機種ごとに細かくチューニングを行う必要があります。

値の精度について

1
2
3
4
5
6
7
// SensorEventListenerなので追加。ただし、使わないのでStub
// センサーの精度が変更されたときに呼び出される。
public void onAccuracyChanged(Sensor sensor, int accuracy) {
    // TODO 自動生成されたメソッド・スタブ
    //Log.v("Activity","Sensor.TYPE_LIGHT accuracy:" + String.valueOf(accuracy) );
 
}

SensorEventListenerにはセンサーの精度に変更があった時のためのコールバックメソッドも存在します(サンプルコードはStubです)。