環境感應器

Android 平台提供四個感應器,讓您監控各種環境屬性。您可以使用這些感應器監控 Android 裝置附近的相關環境濕度、亮度、環境壓力和環境溫度。這四個環境感應器都以硬體為基礎,且裝置製造商必須內建在裝置中才能使用。除了大多數裝置製造商用來控制螢幕亮度的光度感應器以外,裝置上不一定能使用環境感應器。因此,在嘗試從該感應器擷取資料之前,請務必先在執行階段驗證是否存在環境感應器。

環境感應器會針對每個資料事件傳回單一感應器值,但與大多數動作感應器和位置感應器不同,後者會傳回每個 SensorEvent 的多維度感應器值。例如 °C 的溫度或 hPa 的壓力。 此外,與動作感應器和位置感應器 (通常需要高傳遞或低傳遞篩選) 不同的是,環境感應器通常不需要任何資料篩選或資料處理。表 1 摘要說明 Android 平台支援的環境感應器。

表 1. Android 平台支援的環境感應器。

感應器 感應器事件資料 測量單位 資料說明
TYPE_AMBIENT_TEMPERATURE event.values[0] °C 環境空氣溫度。
TYPE_LIGHT event.values[0] lx 照明度。
TYPE_PRESSURE event.values[0] hPa 或 mbar 環境氣壓。
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),您可以使用這兩個資料串流來計算露點和絕對濕度。

露點

露點是指必須以固定的氣壓在氣壓下冷卻冷卻水汽水調節到水中的氣溫溫度的溫度。以下方程式可以說明如何計算露點:

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 = 絕對濕度 (公克/公尺3)
  • t = 實際溫度 (以攝氏度為單位)
  • RH = 實際相對濕度 (百分比)
  • m = 17.62
  • Tn = 243.12 度 C
  • A = 6.112 hPa

另請參閱