環境センサー

Android プラットフォームには、さまざまな環境プロパティをモニタリングする 4 つのセンサーが用意されています。これらのセンサーを使用して、Android 搭載デバイスの周囲の相対湿度、照度、周囲圧力、温度をモニタリングできます。4 つの環境センサーはすべてハードウェア ベースであり、デバイス メーカーがデバイスに内蔵している場合にのみ利用できます。ほとんどのデバイス メーカーが画面の明るさを制御するために使用している光センサーを除き、環境センサーが常にデバイスで使用可能であるとは限りません。そのため、データを取得する前に、環境センサーが存在するかどうかを実行時に確認することが特に重要です。

ほとんどのモーション センサーや位置センサーは、SensorEvent ごとにセンサー値の多次元配列を返しますが、環境センサーはデータイベントごとに単一のセンサー値を返します。(例: 温度(°C)、圧力(hPa))。 また、ハイパス フィルタリングやローパス フィルタリングが必要になることが多いモーション センサーや位置センサーとは異なり、環境センサーは通常、データのフィルタリングやデータ処理を必要としません。表 1 に、Android プラットフォームでサポートされている環境センサーの概要を示します。

表 1. Android プラットフォームでサポートされている環境センサー

センサー センサー イベント データ 測定単位 データの説明
TYPE_AMBIENT_TEMPERATURE event.values[0] °C 周囲の気温。
TYPE_LIGHT event.values[0] ルクス 照度。
TYPE_PRESSURE event.values[0] ヘクトパスカルまたはミリバール 周囲の気圧。
TYPE_RELATIVE_HUMIDITY event.values[0] % 周囲の相対湿度。
TYPE_TEMPERATURE event.values[0] °C デバイスの温度。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

絶対湿度

絶対湿度とは、一定量の乾燥空気中に含まれる水蒸気の質量で、絶対湿度はグラム/メートル単位で測定されます3。次の式は、絶対湿度の計算方法を示しています。

d_v(t,RH) =  (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 ヘクトパスカル

関連ドキュメント