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 (温度センサー)
などは今回のサンプルコードの一部を変えることで同様に扱えます。ぜひ試してみてください。
センサーマネージャの取得
/* センサーマネージャ */ 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); }
照度センサーの登録
//* 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メソッドでセンサ数を確認してからリスナを登録しています。
値の取得
// 通知タイミングは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で試しましたが、これらの数字は機種ごとに異なる可能性もあるので一つの目安としてみてください。最終的には機種ごとに細かくチューニングを行う必要があります。
値の精度について
// SensorEventListenerなので追加。ただし、使わないのでStub // センサーの精度が変更されたときに呼び出される。 public void onAccuracyChanged(Sensor sensor, int accuracy) { // TODO 自動生成されたメソッド・スタブ //Log.v("Activity","Sensor.TYPE_LIGHT accuracy:" + String.valueOf(accuracy) ); }
SensorEventListenerにはセンサーの精度に変更があった時のためのコールバックメソッドも存在します(サンプルコードはStubです)。