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)])](https://developer.android.com/static/images/guide/topics/sensors/dew_point.png?hl=zh-tw)
其中
- td = 露點溫度 (以度為單位)
- t = 實際溫度 (以攝氏度為單位)
- RH = 實際相對濕度 (百分比)
- m = 17.62
- Tn = 243.12
絕對濕度
絕對濕度是指水蒸氣在乾燥環境中的質量。絕對濕度的測量單位為公克/公尺3。下列方程式說明如何計算絕對濕度:

其中
- dv = 絕對濕度 (公克/公尺3)
- t = 實際溫度 (以攝氏度為單位)
- RH = 實際相對濕度 (百分比)
- m = 17.62
- Tn = 243.12 度 C
- A = 6.112 hPa