Sensor
Android设备支持种类众多的传感器,诸如光线传感器、加速度传感器、磁场传感器、压力传感器等等。应用场景很丰富,比如用在手机自动调整亮度、游戏里的方向控制等等。
1、SensorManager
传感器管理类,管理手机上的各种传感器。这个类提供的各种方法可以访问传感器列表、注册或解除注册传感器事件监听、获取方位信息等。通过getSystemService()获取SensorManager实例:
SensorManager mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);官方文档关于SensorManager的部分说明“SensorManager 允许你访问设备的感应器。通过传入参数SENSOR_SERVICE参数调用Context.getSystemService方法可以获得一个sensor的实例。永远记得确保当你不需要的时候,特别是Activity暂定的时候,要关闭感应器。忽略这一点肯能导致几个小时就耗尽电池,注意当屏幕关闭时,系统不会自动关闭感应器。”
2、Sensor传感器
这个类提供的方法可以让你决定一个传感器的功能,通过SensorManager实例可以获取到指定TYPE的传感器实例。举个例子,获取光线传感器:
Sensor mLightSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_LIGHT);其它更多Sensor类型可以查看Senor文档与源码:
TYPE_ALL //用于列出所有感应器
TYPE_ACCELEROMETER //三轴加速度感应器 返回三个坐标轴的加速度 单位m/s2
TYPE_GRAVITY //重力感应器
TYPE_GYROSCOPE //陀螺仪 可判断方向 返回三个坐标轴上的角度
TYPE_LIGHT //光线感应器 单位 lux 勒克斯
TYPE_LINEAR_ACCELERATION //线性加速度
TYPE_MAGNETIC_FIELD //磁场感应 返回三个坐标轴的数值 微特斯拉
TYPE_ORIENTATION //方向感应器 已过时 可以使用方法获得
TYPE_PRESSURE //压力感应器 单位 千帕斯卡
TYPE_PROXIMITY //距离传感器
TYPE_ROTATION_VECTOR //翻转传感器
TYPE_TEMPERATURE //温度传感器 单位 摄氏度如果不知道手机有哪些传感器,使用Sensor.TYPE_ALL,可以获取手机所有传感器的集合。
List<Sensor> sensors = mSensorManager.getSensorList(Sensor.TYPE_ALL);打印集合可以看到我手机上的传感器一共有,部分如下:
... ...
{Sensor name="win_orient Non-wakeup", vendor="vivo", version=1, type=66537, maxRange=1.0, resolution=0.1, power=0.001, minDelay=0}
{Sensor name="sns_tilt Wakeup", vendor="qualcomm", version=1, type=22, maxRange=1.0, resolution=1.0, power=0.025, minDelay=0}
{Sensor name="pedometer Non-wakeup", vendor="vivo", version=1, type=18, maxRange=1.0, resolution=1.0, power=0.001, minDelay=0}
{Sensor name="pedometer Non-wakeup", vendor="vivo", version=1, type=19, maxRange=4.2949673E9, resolution=1.0, power=0.001, minDelay=0}
{Sensor name="stationary_detect", vendor="qualcomm", version=1, type=29, maxRange=1.0, resolution=1.0, power=0.025, minDelay=-1}
{Sensor name="sns_smd Wakeup", vendor="qualcomm", version=1, type=17, maxRange=1.0, resolution=1.0, power=0.025, minDelay=-1}
... ...3、SensorEventListener
获取到SensorManager和传感器Sensor的实例之后,还需要注册一个传感器事件监听器,定义如下,需要实现onAccuracyChanged,onSensorChanged这两个方法:
private SensorEventListener mSensorEventListener = new SensorEventListener() {
@Override
public void onSensorChanged(SensorEvent event) {
//传感器事件值改变时的回调接口:执行此方法的频率与注册传感器时的频率有关
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
//传感器精度发生改变时做些操作,accuracy为当前传感器精度
}
};在onResume()中给指定的Sensor注册传感器监听器:
/*
*第一个参数:SensorEventListener接口的实例对象
*第二个参数:需要注册的传感器实例
*第三个参数:传感器获取传感器事件event值频率:
* SensorManager.SENSOR_DELAY_FASTEST = 0:对应0微秒的更新间隔,最快,1微秒 = 1 % 1000000秒
* SensorManager.SENSOR_DELAY_GAME = 1:对应20000微秒的更新间隔,游戏中常用
* SensorManager.SENSOR_DELAY_UI = 2:对应60000微秒的更新间隔
* SensorManager.SENSOR_DELAY_NORMAL = 3:对应200000微秒的更新间隔
* 键入自定义的int值x时:对应x微秒的更新间隔
*/
mSensorManager.registerListener(mSensorEventListener, mLightSensor, SensorManager.SENSOR_DELAY_NORMAL)在onPause()中反注册,否则后台一直监听会非常耗电:
mSensorManager.unregisterListener(mSensorEventListener);大部分传感器会返回三个轴方向x,y,x的event值,值的意义因传感器而异。在SensorEventListener中的onSensorChanged()获取变化的值:
@Override
public void onSensorChanged(SensorEvent event) {
float[] values = event.values;
float x = values[0];
float y = values[1];
float z = values[2];
//... ...
}4、几种常用Sensor
简单介绍了解一下绝大多数手机都有的传感器,也是比较常用的。更多详细介绍参考官方文档。引用博客《Android Sensor传感器总结》
4.1、Accelerometer 加速度传感器
加速度传感器又叫G-sensor,返回x、y、z三轴的加速度数值。该数值包含地心引力的影响,单位是m/s^2。
将手机平放在桌面上,x轴默认为0,y轴默认0,z轴默认9.81。 将手机朝下放在桌面上,z轴为-9.81。 将手机向左倾斜,x轴为正值。 将手机向右倾斜,x轴为负值。 将手机向上倾斜,y轴为负值。 将手机向下倾斜,y轴为正值。
4.2、Ambient Light Sensor (环境)光线感应传感器
光线感应传感器检测实时的光线强度,光强单位是lux(勒克司度),其物理意义是照射到单位面积上的光通量。光线感应传感器主要用于Android系统的LCD自动亮度功能。可以根据采样到的光强数值实时调整LCD的亮度。
4.3、Step Detector 步数探测器、Step Counter 计步器
就是手机计步用的,APP诸如KEEP都有自己的复杂算法去优化底层的数据,更加准确的计算用户的步数。
5、结束
Android为我们提供了方便的API去获取和控制各种硬件层的传感器。与其只是简单的调用一个API,更多需要了解这些底层的运作,架构设计。还有业务、算法、场景的应用。有时间的话看看下面两篇非常不错的博客,也可以自己抽空看看源码和Android官方API文档。

