本文译自:http://developer.android.com/guide/topics/sensors/sensors_environment.html#sensors-using-humid
Android平台提供了四种监测各种环境属性的传感器。使用这些传感器能够监视相对Android设备附近范围内的空气湿度、光照度、大气压力,以及温度等。所有这四种环境传感器都是基于硬件的,并且只有在制造商把它们内置到设备中时才有效。大多数制造商都使用光线传感器来控制屏幕的亮度,其他的环境传感器不总是在所有的设备上都是有效的。因为这种原因,在运行时视图获取环境数据之前,确认相应的环境传感器是否存在,是特别重要的。
跟大多数的用每个SensorEvent参数来返回传感器值的多维数组的运动传感器和位置传感器不一样,环境传感器用每个数据事件来返回一个单一传感器值。例如,以°C为单位的温度、以hPa为单位的气压。它也不像运动传感器和位置传感器那样,经常需要高通或低通滤波,典型的环境传感器不需要任何的数据过滤或数据处理。表1提供了Android平台所支持的环境传感器的概要介绍:
表1.Android平台所支持的环境传感器
传感器 | 传感器事件数据 | 测量单位 | 数据介绍 |
TYPE_AMBIENT_TEMPERATURE |
| °C | 周围空气温度 |
TYPE_LIGHT |
| lx | 光照度 |
TYPE_PRESSURE |
| hPa or mbar | 周围空气压力 |
TYPE_RELATIVE_HUMIDITY |
| % | 周围的相对湿度 |
TYPE_TEMPERATURE |
| °C | 设备的温度.1 |
.1该实现随着设备的不同而不同,在Android4.0(API Level 14)中被弃用。
使用光线、压力和温度传感器
通常,从光线、压力、和温度传感器中获取的原始数据不需要校正、过滤或修正,这使得他们成为最容易使用的传感器。首先创建一个SensorManager类的实例来获取数据,你能使用的SensorManager类的实例来获取一个物理传感器实例。然后在onResume()方法中注册一个传感器的监听器,并且在onSensorChanged()回调方法中开始处理输入的传感器数据。以下代码显示了如何做这件事:
public class SensorActivity extends Activity implements SensorEventListener {
private SensorManager mSensorManager;
private Sensor mPressure;
@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.
mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
mPressure = mSensorManager.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 millibars_of_pressure = event.values[0];
// Do something with this sensor data.
}
@Override
protected void onResume() {
// Register a listener for the sensor.
super.onResume();
mSensorManager.registerListener(this, mPressure, SensorManager.SENSOR_DELAY_NORMAL);
}
@Override
protected void onPause() {
// Be sure to unregister the sensor when the activity pauses.
super.onPause();
mSensorManager.unregisterListener(this);
}
}
你必须始包含onAccuracyChanged()和onSensorChanged()回调方法的实现。还有始终要确保在Activity被挂起时注销传感器,这样会防止持续的感知数据并降低电池的消耗。
使用湿度传感器
与使用光线、压力和温度传感器的方法相同,通过使用湿度传感器,你能够获取原始的相对湿度数据。但是,如果一个设备上同时湿度传感器(TYPE_RELATIVE_HUMIDITY)和温度传感器(TYPE_AMBIENT_TEMPERATURE),那么你就能够使用这两个数据流来计算露点和绝对湿度。
露点
露点是给定体积的气体在恒定的大气压力下,水蒸汽由气体转换成水的温度,下列代码显示了如何计算露点的公式:
ln(RH/100%) + m·t/(Tn+t)
td(t,RH) = Tn · ------------------------------------
m - [ln(RH/100%) + m·t/(Tn+t)]
其中
1. td =露点温度,单位:摄氏度;
2. t =实际温度,单位:摄氏度;
3. RH=实际的相对湿度,百分比;
4. m=17.62
5. Tn=243.12
绝对湿度
绝对湿度是给定体积的空气中水的质量。绝对湿度的测量单位是:克/立方米(grams/meter3),以下是计算绝对湿度的公式:
(RH/100%) · A · exp(m·t/(Tn+t)
dv(t,RH) = 216.7 · ------------------------------------
273.15 + t
其中:
1. dv =绝对湿度,单位:克/立方米
2. t = 实际温度,单位:摄氏度
3. RH = 实际的相对湿度,百分比
4. m = 17.62
5. Tn= 243.12摄氏度
6. A = 6.112hPa