Androidアプリから、その実機がサポートしているSensor(センサー)の一覧の取得方法は?
Androidアプリから、サポートしているSensorの取得方法は、以下のようにします。
まずはSensorManagerインスタンスを取得します。
SensorManager sm = (SensorManager)getSystemService(SENSOR_SERVICE);
次のステップですが、一応、2つ方法があるのですが、一つは非推奨(deprecated)になっています。
Androidに限らず、Java全般に言えることですが、基本的には、非推奨となっているAPIは使わないようにしましょう。
まずは、敢えて非推奨な方法から紹介します。
SensorManager.getSensors()を使います。
int sensor = sm.getSensors();
戻り値はint型です。
戻り値には、サポートしている各センサーに対応したビットフラグが立った状態の値が返されます。
例えば、方位センサーがあるかどうかは、以下のような判定式で判定します。
if((sensor & SensorManager.SENSOR_ORIENTATION) != 0 ){
//このif文に入れば、方位センサーがサポートされている
}
上の方法が非推奨になった理由はわかりませんが、あとで紹介する方法に比べると、使い勝手があまりよくないかなぁと思いますね。
次は、推奨の方法です。非推奨版に比べると、よりオブジェクト指向っぽくなったという感があります。
スポンサーリンク
SensorManager.getSensorList()を使います。
List<sensor> list = sm.getSensorList(Sensor.TYPE_ALL );
戻り値は、Sensor型のListです。
引数は、取得したいセンサーを指定しますが、サポートしている全てのSensorを取得したい場合は、上記のようにSensor.TYPE_ALLを指定します。
戻り値のListを以下のようにすると、何のセンサーがサポートされているか判定できます。
for(Sensor s :list){
//例えば、センサーの名前をログに出す
Log.i(s.getName());
//例えば、センサーのタイプをログに出す
Log.i(s.getType());
}
getType()の戻り値が、そのSensorのタイプです。
例えば、方位センサーを示すSensorであれば、TYPE_ORIENTATIONが返されます。
センサーを使うのであれば、センサーのリスナーも登録しますよね。
ついでなので、その方法も、上記の非推奨のパターンと、推奨のパターンで紹介しておきます。
まずは非推奨な場合です。
SensorManager.registerListener()を使います。
例えばサポートしている全てのセンサーを登録する場合は、以下のような感じです。
int sensor = sm.getSensors();
sm.registerListener(this,sensor);
第1引数は、SensorListenerを実装しているインスタンスを指定します。
第2引数は、登録したいセンサーのビット和の値です。
実は、このSensorListenerというインタフェース自体も、非推奨になっています。
registerListener()の、この使い方も非推奨になっています。
次は推奨の方法です。
SensorManager.registerListener()を使いますが、上とは引数が異なります。
例えばサポートしている全てのセンサーを登録する場合は、以下のような感じです。
List<sensor> list = sm.getSensorList(Sensor.TYPE_ALL );
for(Sensor s :list){
sm.registerListener(this, s);
}
第1引数は、SensorListenerではなく、SensorEventListenerを実装したインスタンスになります。
第2引数には、登録するSensor型インスタンスを指定します。
イベントはSensorEventListenerを実装したインスタンスのonSensorChanged()で通知されます。
引数から、SensorEvent型のインスタンスが取得できます。
今回はここまでとして、イベント処理に関しては、また別の機会に・・。
今回の記事は、私が以前センサーの一覧取得方法を調べたときに、SensorManager.getSensors()が非推奨(deprecated)となっていた為に、APIリファレンスから調べたことです。
書籍やネット上に掲載されているサンプルコードだと、今回のように非推奨(deprecated)となっている事が結構あります。
そのときは、AndroidのAPIリファレンスを見れば、今はどのAPIが推奨されているのか?という事がすぐにわかりますので参考にして下さい。
Android SDK付属のAPIリファレンスで、非推奨のSensorManager.getSensors()を見ると、以下のように記述されています。
これにより、「getSensorList(Sensor.TYPE_ALL )を使えばいいのか!」とわかります。
ちなみに、APIリファレンスの在り処は以下の記事を参照してください。
Android APIリファレンスの場所
Leave a Reply