Android平台提供了4个传感器以方便检测各种环境的参数,通过使用这些传感器,能感知到Android设备周围的相对湿度、光照强度、周围压力和周围的温度。所有这4个环境传感器全都是基于硬件的,只有当设备厂商内置了它们才可以使用。大多数设备厂商使用光线传感器控制屏幕的亮度,除了这个传感器外,其他环境传感器很少在设备中使用。因此,在从环境传感器中获取数据前,需要动态地检查环境传感器是否存在,对于环境传感器来说,这是尤其重要的。
大多数位移传感器和位置传感器,会通过SensorEvent.value返回一个多维数组,环境传感器和她们不同,它在每个数据事件中,只返回一个单值(SensorEvent.value[0])。例如,以°C为单位的温度传感器或以hPa为单位的压力传感器。另外,不像位移传感器和位置传感器那样常常需要高通或低通过滤,环境传感器通常不需要数据过滤或数据处理。表1总结了Android平台所支持的环境传感器。
表1. Android平台支持的环境传感器
Sensor | Sensor event data | 计量单位 | 数据描述 |
---|---|---|---|
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 Level 14)后被标注为deprecated。
光照,压力和温度传感器的使用
从光照、压力、温度传感器中获得的数据通常不需要校正、过滤或修改等处理,它们是最容易使用的传感器。为了从这些传感器中获取数据,首先需要创建一个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 pause时unregister sensor,这样可以避免传感器持续采集数据从而耗费电池电量。
湿度传感器的使用
通过使用湿度传感器能够获得相对湿度的原始数据,使用方法和光照,压力和温度传感器一样。然而,如果设备上同时又湿度传感器(TYPE_RELATIVE_HUMIDITY) 和温度传感器(TYPE_AMBIENT_TEMPERATURE),可以使用这两种传感器的数据流计算出露点温度和绝对湿度。
露点温度
露点温度是指在恒定的气压 下,定量的空气从水蒸气被冷却到水的温度。下面是计算露点的公式:
td(t,RH)=Tn⋅ln(RH/100%)+m⋅t/(Tn+t)m−[ln(RH/100%)+m⋅t/(Tn+t)]
这里,
td
= 以摄氏度为单位的露点温度
t = 以摄氏度为单位的实际温度
RH = 以百分比(%)为单位的实际相对湿度
m = 17.62
Tn
= 243.12
绝对湿度
绝对湿度是指定量干燥空气中所含水蒸气的质量。绝对湿度的计量单位是克/米 3 。以下是计算绝对湿度的公式:
dv(t,RH)=216.7⋅(RH/100%)⋅A⋅exp(m⋅t/(Tn+t)273.15+t
这里,
dv
= 单位为
g/m3
为单位的绝对湿度
t = 以摄氏度为单位的实际温度
RH = 以百分比(%)为单位的实际相对湿度
m = 17.62
Tn
= 243.12 摄氏度
A = 6.112 hPa