Android プラットフォームでは、さまざまな環境プロパティを監視するために 4 種類のセンサーを利用できます。 これらのセンサーを使用して、Android 搭載デバイスの周囲の相対湿度、照度、気圧、温度をモニタリングできます。4 種類の環境センサーはすべてハードウェアベースで、デバイス メーカーがデバイスに組み込んだ場合にのみ使用できます。光センサーについては、ほとんどのデバイス メーカーが画面の輝度調整のために採用していますが、その他の環境センサーは常にデバイスに組み込まれているとは限りません。そのため、環境センサーからデータを取得するアプリでは、ランタイムにその環境センサーの存在を事前確認することが特に重要です。
モーション センサーや位置センサーからは、SensorEvent
ごとにセンサー値の多次元配列が返されますが、環境センサーからは、データイベントごとに 1 つのセンサー値が返されます。たとえば、温度(°C)や圧力(ヘクトパスカル)といった値です。
また、モーション センサーや位置センサーでは、通常の場合ハイパス フィルタやローパス フィルタが必要ですが、環境センサーでは、基本的にデータのフィルタやデータ処理は必要ありません。表 1 に、Android プラットフォームでサポートされている環境センサーの概要を示します。
表 1. Android プラットフォームでサポートされている環境センサー
センサー | センサー イベント データ | 測定単位 | データの説明 |
---|---|---|---|
TYPE_AMBIENT_TEMPERATURE |
event.values[0] |
℃ | 周囲の気温。 |
TYPE_LIGHT |
event.values[0] |
ルクス | 照度。 |
TYPE_PRESSURE |
event.values[0] |
ヘクトパスカルまたはミリバール | 周囲の気圧。 |
TYPE_RELATIVE_HUMIDITY |
event.values[0] |
% | 周囲の相対湿度。 |
TYPE_TEMPERATURE |
event.values[0] |
℃ | デバイスの温度。1 |
1 実装方法はデバイスごとに異なります。このセンサーは、Android 4.0(API レベル 14)でサポートが終了しました。
光センサー、圧力センサー、温度センサーの使用
光センサー、圧力センサー、温度センサーは、通常の場合、取得した測定データの調整、フィルタ、加工を必要としません。そのため、比較的容易に使用できるセンサー類といえます。これらのセンサーからデータを取得するには、まず SensorManager
クラスのインスタンスを作成します。これを使用して、物理センサーのインスタンスを取得できます。
次に、センサー リスナーを onResume()
メソッドで登録し、センサーから入ってくるデータの処理を onSensorChanged()
コールバック メソッドで開始します。次のコードは、この方法を示しています。
Kotlin
class SensorActivity : Activity(), SensorEventListener { private lateinit var sensorManager: SensorManager private var pressure: Sensor? = null public override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.main) // Get an instance of the sensor service, and use that to get an instance of // a particular sensor. sensorManager = getSystemService(Context.SENSOR_SERVICE) as SensorManager pressure = sensorManager.getDefaultSensor(Sensor.TYPE_PRESSURE) } override fun onAccuracyChanged(sensor: Sensor, accuracy: Int) { // Do something here if sensor accuracy changes. } override fun onSensorChanged(event: SensorEvent) { val millibarsOfPressure = event.values[0] // Do something with this sensor data. } override fun onResume() { // Register a listener for the sensor. super.onResume() sensorManager.registerListener(this, pressure, SensorManager.SENSOR_DELAY_NORMAL) } override fun onPause() { // Be sure to unregister the sensor when the activity pauses. super.onPause() sensorManager.unregisterListener(this) } }
Java
public class SensorActivity extends Activity implements SensorEventListener { private SensorManager sensorManager; private Sensor pressure; @Override public final void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); // Get an instance of the sensor service, and use that to get an instance of // a particular sensor. sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); pressure = sensorManager.getDefaultSensor(Sensor.TYPE_PRESSURE); } @Override public final void onAccuracyChanged(Sensor sensor, int accuracy) { // Do something here if sensor accuracy changes. } @Override public final void onSensorChanged(SensorEvent event) { float millibarsOfPressure = event.values[0]; // Do something with this sensor data. } @Override protected void onResume() { // Register a listener for the sensor. super.onResume(); sensorManager.registerListener(this, pressure, SensorManager.SENSOR_DELAY_NORMAL); } @Override protected void onPause() { // Be sure to unregister the sensor when the activity pauses. super.onPause(); sensorManager.unregisterListener(this); } }
必ず、onAccuracyChanged()
コールバック メソッドと onSensorChanged()
コールバック メソッドの両方の実装を含めてください。また、アクティビティが一時停止したときには、必ずセンサーの登録を解除してください。これにより、センサーによるデータ検出の継続と電池消耗を防ぐことができます。
湿度センサーの使用
光センサー、圧力センサー、温度センサーと同様の方法で、湿度センサーを使用して相対湿度の測定データを取得できます。ただし、デバイスに湿度センサー(TYPE_RELATIVE_HUMIDITY
)と温度センサー(TYPE_AMBIENT_TEMPERATURE
)の両方がある場合は、これらの 2 つのデータ ストリームから露点温度と絶対湿度を計算できます。
露点温度
露点温度とは、一定量の空気を一定の気圧の下で冷却したとき、水蒸気が凝結して水になり始める温度のことです。次の式は、露点温度の計算方法を示しています。
![t_d(t,RH) = Tn · (ln(RH/100) + m·t/(T_n+t))/(m - [ln(RH/100) + m·t/(T_n+t)])](https://developer.android.com/static/images/guide/topics/sensors/dew_point.png?authuser=2&hl=ja)
ここで、
- td = 露点温度(℃)
- t = 実際の気温(℃)
- RH = 実際の相対湿度(%)
- m = 17.62
- Tn = 243.12
絶対湿度
絶対湿度とは、一定量の乾燥空気中に含まれる水蒸気の質量で、測定単位は g/m3 です。絶対湿度の計算方法は次のとおりです。

ここで、
- dv = 絶対湿度(g/m3)
- t = 実際の気温(℃)
- RH = 実際の相対湿度(%)
- m = 17.62
- Tn = 243.12℃
- A = 6.112 ヘクトパスカル