◆PROCESSING 逆引きリファレンス
カテゴリー:スマホ(AndroidMode)
利用可能なセンサーを知るには(AndroidMode編)
【概要】
PROCESSINGにAndroidMode を導入する事で、PROCESSINGで開発したプログラムをAndroid端末上で動かす事ができるようになります。
AndroidModeの導入については「PROCESSINGをAndroid端末で動かすには(4.0版)」記事を参照してください。
スマホの魅力は様々なアプリケーションを動作させることができるだけではなく、様々なセンサーを手軽に使うことができる点ではないでしょうか?。
機種にもよりますが、スマホに搭載されている代表的なセンサーには以下のようなものがあります。
センサー | 役割 | |
---|---|---|
1 | 加速度センサー(重力加速度センサー) | 端末の動きを検知するセンサーです。一定時間の間に、速度がどの方向にどれだけ変化したかを知ることが可能です。端末の傾きを検知するのに利用されています。 |
2 | ジャイロスコープ | 端末の回転を検出するセンサーです。角加速度(回転時の速度変化)を検知します。最近の端末には、これとよく似た回転ベクトルセンサーが搭載されているものがあります。話題のポケモン Goを遊ぶために必要なセンサーですね(笑)。 |
3 | 地磁気センサー | 端末の傾きも検知しますが、方角を知ることができるセンサーです。地図系アプリに利用されています。 |
4 | 輝度センサー | 明るさを検知するセンサーです。周りの明るさに応じて端末画面の輝度を調整したりするのに使われています。 |
5 | 近接センサー | 特定範囲に物体が存在するか否かを検知するセンサーです。 |
6 | 圧力センサー | 端末にかかる圧力を検知するセンサーです。気圧の測定などに利用可能です。 |
7 | 周囲温度センサー | 外気温を測定するセンサーです。昔は端末の温度を測るものもあったようですが、今は外気温用となっています。 |
8 | 相対湿度センサー | そのままですね。湿度を測定するものですが・・・これ搭載している機種あるのでしょうか?。 |
9 | ステップカウンタ | 最近の端末に搭載されているもので、歩数を知ることが可能です。 |
ほんと沢山ありますね。理工系に詳しくない私には、?マークがつくセンサーばかりです(汗)。
これらのセンサーは必ず搭載されているわけではなく、機種によっては搭載されていないものがあります。
スマホでどんなセンサーが利用できるかは、2種類の方法で調べることが可能です。
【詳細】
センサー情報取得
センサー管理オブジェクト取得SensorManager mng = act. getSystemService( String ServiceName ) ;
mng : センサー管理オブジェクト
ServiceName : サービス名(SENSOR_SERVICE)
センサーを利用するには、まずはセンサー管理オブジェクトを取得する必要があります。
センサーから値を読み取るだけでなく、利用可能なセンサーを知りたい場合でも、センサー管理オブジェクトが必要となります。
センサー管理オブジェクトは、ActivityのgetSystemServiceメソッドで取得します。
getSystemServiceには取得したいサービス名を与えることで、様々な情報が取得可能です。
センサー管理情報を取り出すには、getSystemServiceメソッドに、Context クラスがもつ SENSOR_SERVICE定数(Context.SENSOR_SERVICE)を与えてください。
センサー制御オブジェクト取得Sensor sensor = mng . getDefaultSensor(int Type) ;
sensor : センサー制御オブジェクト。利用できない場合は nullが戻る
mng : センサー管理オブジェクト
Type : 取り出すセンサーの種類
Typeに取り出したいセンサーの種類を与えることで、センサー制御用のオブジェクトを取得できます。
例えば加速度センサー用のオブジェクトを取り出したいなら、TypeにはSensorクラスがもつTYPE_ACCELEROMETER定数(Sensor.TYPE_ACCELEROMETER)を指定します。
この時、センサーオブジェクトが取り出せない(= null が戻される)ようなら、そのセンサーは該当端末では利用できないセンサーとなります。
注意としては、該当端末に複合センサー(いわゆる「相当品」)がある場合です。
getDefaultSensorメソッドは複合センサーを単一のセンサーとは区別せず、利用可能と判断します。
Aというセンサーは搭載していないけれど、搭載されているBセンサーとCセンサーをあわせて利用すると、Aセンサーと同じような測定が可能な場合、Aセンサーが利用可能と判断されるという事です。
実際に搭載されている機械としてのセンサーを知りたい場合は、次に紹介するgetSensorListを使います。
センサー一覧取得List list = mng . getSensorList(int Type) ;
list : センサー一覧
mng : センサー管理オブジェクト
Type : 取り出すセンサーの種類
Typeに取り出したいセンサーの種類を与えることで、センサー制御用のオブジェクトをList形式で取得できます。
該当端末で利用可能なすべてのセンサーを取り出したいなら、SensorクラスがもつTYPE_ALL定数(Sensor.TYPE_ALL)を指定します。
なお本記事と以下のプログラムは、下記サイト様を参考とさせて頂きました。ありがとうございます。
【関連記事】
サンプルプログラム
センサーオブジェクトを取得する例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 |
import android.app.Activity; import android.content.Context; import android.hardware.Sensor; import android.hardware.SensorManager; /** * PROCESSING SensorGet Sample * @auther MSLABO * @version 2018/06 1.0 */ //Android Senser一覧 private int[] sensorTypeList = { Sensor.TYPE_ACCELEROMETER, //加速度センサー Sensor.TYPE_ACCELEROMETER_UNCALIBRATED, //加速度センサー(非補正) Sensor.TYPE_AMBIENT_TEMPERATURE, //周囲温度センサー Sensor.TYPE_DEVICE_PRIVATE_BASE, //ベンダー定義センサー Sensor.TYPE_GAME_ROTATION_VECTOR, //回転ベクトルセンサー(非補正) Sensor.TYPE_GEOMAGNETIC_ROTATION_VECTOR, //地磁気回転ベクトルセンサー Sensor.TYPE_GRAVITY, //重力加速度センサー Sensor.TYPE_GYROSCOPE, //ジャイロスコープ Sensor.TYPE_GYROSCOPE_UNCALIBRATED, //ジャイロスコープ(非補正) Sensor.TYPE_HEART_BEAT, //心拍計センサー Sensor.TYPE_HEART_RATE, //心拍数センサー(1分間の心拍数) Sensor.TYPE_LIGHT, //照度センサー Sensor.TYPE_LINEAR_ACCELERATION, //線形加速度センサー(重力を除く) Sensor.TYPE_LOW_LATENCY_OFFBODY_DETECT, //体が離れた事を検知するセンサー Sensor.TYPE_MAGNETIC_FIELD, //地磁気センサー Sensor.TYPE_MAGNETIC_FIELD_UNCALIBRATED, //地磁気センサー(非補正) Sensor.TYPE_MOTION_DETECT, //動作感知センサー Sensor.TYPE_POSE_6DOF, //6軸姿勢センサー Sensor.TYPE_PRESSURE, //気圧センサー Sensor.TYPE_PROXIMITY, //近距離センサー Sensor.TYPE_RELATIVE_HUMIDITY, //相対湿度センサー Sensor.TYPE_ROTATION_VECTOR, //傾きセンサー Sensor.TYPE_SIGNIFICANT_MOTION, //動作開始検知するセンサー Sensor.TYPE_STATIONARY_DETECT, //動作停止検知するセンサー Sensor.TYPE_STEP_COUNTER, //歩数カウンター Sensor.TYPE_STEP_DETECTOR, //歩き出したことを検知するセンサー Sensor.TYPE_ORIENTATION, //傾きセンサー(非推奨) Sensor.TYPE_TEMPERATURE //温度センサー(非推奨) }; ArrayList<String> sensorAvailableList = new ArrayList<String>(); Activity act; float fontSize; void setup(){ fullScreen(); //センサー管理OBJ取得 act = getActivity(); SensorManager mSenser = (SensorManager)act.getSystemService(Context.SENSOR_SERVICE); //センサー制御OBJを取得して利用可能か調べる for( int i = 0; i < sensorTypeList.length; i++ ){ Sensor sensor = mSenser.getDefaultSensor(sensorTypeList[i]); if( sensor != null){ //利用可能 sensorAvailableList.add( String.format("%s - %s", sensor.getName(), sensor.getVendor()) ); } } fontSize = 14 * displayDensity; textSize(fontSize); textAlign(LEFT, TOP); } void draw(){ background(0); //センサー一覧を表示する int index = 1; for( String s : sensorAvailableList){ text( String.format("%s : %s",nfs(index,2), s), 0, index * fontSize ); index++; } } |
センサー管理オブジェクトとセンサー制御オブジェクトの取得は、センサーの利用可否を知るために一時的に取得するだけなので、setup() の中で処理しています。
取得したセンサー制御オブジェクトから値を得る目的で利用するなら、setup() ではなく onResume() で行ったほうが良いでしょう。
下記は手持ちのスマホ(ZTE V580)での実行例です。安価な製品ですので、利用可能なセンサーの数が少ないですね(汗)。
センサー一覧を取得する例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
import android.app.Activity; import android.content.Context; import android.hardware.Sensor; import android.hardware.SensorManager; import java.util.List; /** * PROCESSING SensorList Sample * @auther MSLABO * @version 2018/06 1.0 */ Activity act; //Activity List<Sensor> list; //センサー一覧 float fontSize; //文字サイズ void setup(){ fullScreen(); //センサー管理OBJ取得 act = getActivity(); SensorManager mSenser = (SensorManager)act.getSystemService(Context.SENSOR_SERVICE); //センサー一覧取得 list = mSenser.getSensorList(Sensor.TYPE_ALL); //文字設定 fontSize = 12 * displayDensity; textSize(fontSize); textAlign(LEFT, TOP); fill(255); } void draw(){ background(0); //センサー一覧を表示する int index = 1; for( Sensor s : list){ text( String.format("%s : %s - %s", nfs(index,2),s.getName(), s.getVendor()), 0, index * fontSize ); index++; } } |
実行すると画面にセンサー名とベンダー名が表示されます。
下記は手持ちのスマホ(ZTE V580)での実行例です。
最初に紹介した getDefaultSensorで得た結果と同じ数になりましたので、Z580には複合センサーは搭載されていないようです。
本ページで利用しているアイコン画像は、下記サイト様より拝借しております。各画像の著作権は、それぞれのサイト様および作者にあります。