アンドロイドではサポートされるセンサー機能は20種類以上になりますが、端末に搭載されているかどうかは別です。
Android Studio
2021.2.1
2021.2.1
Sensor
センサーに使われているデバイスも半導体メーカーによって特性が必ずしも同じではありません。特別なセンサーを使う場合は個別にチェックしないと想定した動きになりません。
センサーリスト
の一覧です。
- TYPE_ACCELEROMETER
- 加速度センサー
- x軸、y軸、z軸の各々の加速度
- TYPE_ACCELEROMETER_UNCALIBRATED
- 加速度センサー(生データ)
- TYPE_AMBIENT_TEMPERATURE
- 周囲温度センサー
- 端末周囲の温度
- TYPE_DEVICE_PRIVATE_BASE
- TYPE_GAME_ROTATION_VECTOR
- 回転ベクトルセンサー(地磁気を除く)
- 回転ベクトルセンサーから地磁気を除外したもので方位が不要なゲームでの利用を想定している
- TYPE_GEOMAGNETIC_ROTATION_VECTOR
- 地磁気回転ベクトルセンサー
- 回転ベクトルセンサーと同じだが低消費電力のためジャイロスコープの代わりに地磁気センサーを使用、ただしノイズが多い。屋外使用に適する
- TYPE_GRAVITY
- 重力センサー
- 重力加速度の計測
- TYPE_GYROSCOPE
- ジャイロセンサー
- x軸、y軸、z軸の回転速度、角速度
- TYPE_GYROSCOPE_UNCALIBRATED
- ジャイロスコープ(生データ)
- ジャイロドリフトなどを補正しない生データ
- TYPE_HEART_BEAT
- 心拍検出
- TYPE_HEART_RATE
- 心拍数
- 1分間の心拍数
- TYPE_LIGHT
- 照度センサー
- 周囲の明るさを計測
- TYPE_LINEAR_ACCELERATION
- 加速度センサー(重力を除く)
- x軸、y軸、z軸、各々の加速度を重力加速度を差し引いた値
- TYPE_LOW_LATENCY_OFFBODY_DETECT
- 体が離れたことを検知するセンサー
- TYPE_MAGNETIC_FIELD
- 地磁気センサー
- x軸、y軸、z軸方向の磁気の強さを計測
- TYPE_MAGNETIC_FIELD_UNCALIBRATED
- 地磁気センサー(生データ)
- キャリブレーション無しの地磁気生データ
- TYPE_MOTION_DETECT
- 動作継続検出
- 動きが5秒、10秒継続的かどうか検出
- TYPE_POSE_6DOF
- 回転ベクトルセンサーを更に拡張してたもので、ARなどに使用を想定される youtube
- TYPE_PRESSURE
- 気圧センサー
- いわゆるヘクトパスカル[㍱]を計測
- TYPE_PROXIMITY
- 近接センサー
- 端末スクリーンとの距離、あるいは近い・遠い
- TYPE_RELATIVE_HUMIDITY
- 相対湿度センサー
- 周囲の温度と共に周囲の湿度を計測
- TYPE_ROTATION_VECTOR
- 回転ベクトルセンサー
- 傾き計測、傾きセンサーよりも精度が高い
- TYPE_SIGNIFICANT_MOTION
- 動作検出センサー
- 静から動きを検出するウェイクアップセンサー
- TYPE_STATIONARY_DETECT
- 静止の検出
- TYPE_STEP_COUNTER
- 歩行センサー
- rebootからの歩数をカウント
- TYPE_STEP_DETECTOR
- 歩行検出センサー
- 歩行でトリガーがかかる
サンプルコード
端末のセンサーリストを表示して、この端末で使用できるか確認するコードです。
全てのセンサーのリストとそれが使用できるかをフラグで別に出してみることもできます。
MainActivity.java
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 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 |
//package your.package.name; import androidx.appcompat.app.AppCompatActivity; import android.os.Bundle; import android.hardware.Sensor; import android.hardware.SensorManager; import android.widget.TextView; import java.util.List; public class MainActivity extends AppCompatActivity { private SensorManager sensorManager; private TextView textView; private final int[] sensorList = { Sensor.TYPE_ACCELEROMETER, Sensor.TYPE_ACCELEROMETER_UNCALIBRATED, Sensor.TYPE_AMBIENT_TEMPERATURE, Sensor.TYPE_DEVICE_PRIVATE_BASE, Sensor.TYPE_GAME_ROTATION_VECTOR, // 5 Sensor.TYPE_GEOMAGNETIC_ROTATION_VECTOR, Sensor.TYPE_GRAVITY, Sensor.TYPE_GYROSCOPE, Sensor.TYPE_GYROSCOPE_UNCALIBRATED, Sensor.TYPE_HEART_BEAT, // 10 Sensor.TYPE_HEART_RATE, Sensor.TYPE_LIGHT, Sensor.TYPE_LINEAR_ACCELERATION, Sensor.TYPE_LOW_LATENCY_OFFBODY_DETECT, Sensor.TYPE_MAGNETIC_FIELD, // 15 Sensor.TYPE_MAGNETIC_FIELD_UNCALIBRATED, Sensor.TYPE_MOTION_DETECT, Sensor.TYPE_POSE_6DOF, Sensor.TYPE_PRESSURE, Sensor.TYPE_PROXIMITY, // 20 Sensor.TYPE_RELATIVE_HUMIDITY, Sensor.TYPE_ROTATION_VECTOR, Sensor.TYPE_SIGNIFICANT_MOTION, Sensor.TYPE_STATIONARY_DETECT, Sensor.TYPE_STEP_COUNTER, // 25 Sensor.TYPE_STEP_DETECTOR }; private final String[] sensorNameList = { "ACCELEROMETER", "ACCELEROMETER_UNCALIBRATED", "AMBIENT_TEMPERATURE", "DEVICE_PRIVATE_BASE", "GAME_ROTATION_VECTOR", // "GEOMAGNETIC_ROTATION_VECTOR", "GRAVITY", "GYROSCOPE", "GYROSCOPE_UNCALIBRATED", "HEART_BEAT", // "HEART_RATE", "LIGHT", "LINEAR_ACCELERATION", "LOW_LATENCY_OFFBODY_DETECT", "MAGNETIC_FIELD", // "MAGNETIC_FIELD_UNCALIBRATED", "MOTION_DETECT", "POSE_6DOF", "PRESSURE", "PROXIMITY", // "RELATIVE_HUMIDITY", "ROTATION_VECTOR", "SIGNIFICANT_MOTION", "STATIONARY_DETECT", "STEP_COUNTER", // "STEP_DETECTOR", }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); textView = findViewById(R.id.text_view); sensorManager = (SensorManager)getSystemService(SENSOR_SERVICE); } @Override protected void onResume() { super.onResume(); boolean flg = false; // 表示の切り替え if(flg){ // 端末で使用できるセンサーを表示 checkSensors(); } else{ // センサーリストから使用可能かどうかの表示 checkSensorsEach(); } } private void checkSensors(){ List<Sensor> sensors = sensorManager.getSensorList(Sensor.TYPE_ALL); StringBuffer strListbuf =new StringBuffer("Sensor List:\n\n"); int count = 0; for(Sensor sensor : sensors) { count++; String str = String.format( "%s: %s\n", (count+1), sensor.getName()); strListbuf.append(str); } textView.setText(strListbuf); } private void checkSensorsEach(){ StringBuffer strbuf =new StringBuffer("Sensor List:\n\n"); for(int i=0; i < sensorList.length; i++){ Sensor sensor = sensorManager.getDefaultSensor(sensorList[i]); String strTmp; if(sensor !=null){ strTmp = String.format("%s: %s: 使用可能\n", (i + 1), sensorNameList[i]); } else{ strTmp = String.format("%s: %s: XXX 不可\n", (i + 1), sensorNameList[i]); } strbuf.append(strTmp); } textView.setText(strbuf); } } |
レイアウトです
activity_main.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_main" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:background="#cfe" tools:context=".MainActivity"> <TextView android:id="@+id/text_view" android:layout_margin="20dp" android:textColor="#000" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </LinearLayout> |
センサー機能は端末次第なので、Androidだからすべてのセンサーがあるとは限らないからです。
関連ページ:
- Sensor 一覧を取得する
- 加速度センサー:Accelerometer
- 加速度センサーで球ころがし
- Gyroscope ジャイロセンサー
References:
Sensor
SensorEvent
SensorManager
Motion Sensors