環境センサー

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)])

ここで、

  • td = 露点温度(℃)
  • t = 実際の気温(℃)
  • RH = 実際の相対湿度(%)
  • m = 17.62
  • Tn = 243.12

絶対湿度

絶対湿度とは、一定量の乾燥空気中に含まれる水蒸気の質量で、測定単位は g/m3 です。絶対湿度の計算方法は次のとおりです。

d_v(t,RH) = 216.7 · (RH/100) · A · exp(m·t/(T_n+t))/(273.15 + t)

ここで、

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

関連ドキュメント