mucchinのAndroid戦記

サポートしているセンサー(Sensor)の一覧の取得方法

スポンサーリンク

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()を見ると、以下のように記述されています。
サポートしているセンサー(Sensor)の一覧の取得方法
これにより、「getSensorList(Sensor.TYPE_ALL )を使えばいいのか!」とわかります。


ちなみに、APIリファレンスの在り処は以下の記事を参照してください。
Android APIリファレンスの場所


スポンサーリンク

URL :
TRACKBACK URL :

Leave a Reply

*
* (公開されません)

*

*

Return Top