概述:
大多数Android设备都有内置的传感器用来测量运动, 方向和多种环境状况. 这些传感器可以提供高精度的原始数据, 如果我们想要监测三维设备移动或者位置或者想要监测环境改变的话, 它们都很有用. 栗如, 有些游戏可以通过重力传感器实现用户复杂的手势和运动, 摇晃旋转摆动等. 还有比如一个天气应用可能使用设备的温度传感器和湿度传感器来计算和报告环境参数, 或者旅游APP可能使用地磁传感器和加速计来报告指南针方位.
Android平台支持三类传感器:
l 运动传感器: 这类传感器用三个独立的轴测量加速度和旋转力. 这类包含加速度计, 重力传感器, 陀螺仪和旋转矢量传感器.
l 环境传感器: 这类传感器测量多种环境参数比如环境空气温度和压力, 照明和湿度. 包括气压计, 光度计和温度计.
l 位置传感器: 这类传感器测量设备的物理位置. 包括方向传感器和磁力计.
我们可以访问设备上可用的传感器并通过Android sensor framework来获取原始的传感器数据. Sensorframework提供了很多类和接口让我们可以实现大量的传感器相关的任务. 比如我们可以使用sensor framework做这些事:
l 确定设备上哪些传感器可用.
l 确定一个单独的传感器的能力,比如它的最大范围, 供应商, 电源要求和分辨率.
l 获取传感器原始数据并定义获取原始数据的频率.
l 注册和注销传感器时间监听器.
本文介绍了Android平台上基本传感器的介绍, 也介绍了sensor framework.
传感器基本介绍:
Android sensor framework让我们可以访问多种传感器.有些是基于硬件的有些是基于软件的. 硬件实现的传感器是设备内部的物理组件. 它们直接测量指定的环境属性来获取数据, 比如加速度, 磁场强度或者角度变化. 软件实现的传感器并不是物理设备, 虽然它们看起来在模拟物理传感器. 软件传感器从一个或者多个硬件传感器中获得数据, 有时候会调用虚拟传感器和合成传感器. 线性加速传感器和重力传感器就是软件传感器的栗子. 下表总结了Android平台可以支持的传感器.
只有少部分Android设备拥有全部类型的传感器. 比如大多数手持设备和平板拥有加速计和磁力计, 但是很少但设备拥有气压计和温度计. 同样的一个设备可以拥有多于一种传感器, 比如一个设备可以拥有两个重力传感器, 每个有一个不同的范围.
传感器 |
类型 |
描述 |
常用 |
TYPE_ACCELEROMETER |
硬件 |
测量设备三个方向(x,y和z)的加速度, 单位是m/s2(米每秒平方). 包括重力. |
运动检测(晃动, 倾斜等) |
TYPE_AMBIENT_TEMPERATURE |
硬件 |
测量室内环境温度. 单位是摄氏度. |
监测空气温度. |
TYPE_GRAVITY |
软件或者硬件 |
测量重力加速度, 单位m/s2. |
运动检测(晃动, 倾斜等) |
TYPE_GYROSCOPE |
硬件 |
测量设备的旋转速度, 单位是rad/s. 测量三个物理轴. |
旋转检测. |
TYPE_LIGHT |
硬件 |
测量环境光照等级, 单位lx. |
控制屏幕亮度. |
TYPE_LINEAR_ACCELERATION |
软件或者硬件 |
测量一个设备上的三个物理轴的加速度, 不包括重力. |
监测单个轴线的加速度. |
TYPE_MAGNETIC_FIELD |
硬件 |
测量三个物理轴的磁场, 单位是μT |
创建一个指南针. |
TYPE_ORIENTATION |
软件 |
测量一个设备所有三个物理轴的旋转度数. |
确定设备位置. |
TYPE_PRESSURE |
硬件 |
测量环境空气压力, 单位是hPa或者mbar. |
检测气压改变. |
TYPE_PROXIMITY |
硬件 |
测量一个物体与设备屏幕的距离, 单位是cm. 通常用来确定电话是否靠近人耳朵. |
打电话的时候电话的位置. |
TYPE_RELATIVE_HUMIDITY |
硬件 |
测量相对湿度, 单位是百分比. |
监测绝对和相对湿度. |
TYPE_ROTATION_VECTOR |
软件或者硬件 |
通过旋转矢量的三个元素测量设备的方向. |
运动检测和旋转检测. |
TYPE_TEMPERATURE |
硬件 |
测量设备温度, 单位是摄氏度. 不同设备间该传感器实现不同. 在API 14中, 该传感器被TYPE_AMBIENT_TEMPERATURE代替. |
监测温度. |
SensorFramework:
我们可以使用Sensor Framework访问这些传感器并请求原始数据. Sensor Framework是android.hardware包的一部分, 包含这些的类和接口:
l SensorManager: 我们可以使用该类来创建一个传感器服务的实例. 它提供了多个方法来访问和列举传感器, 注册和注销传感器事件监听器, 获取方位信息. 该类还提供了多种传感器常量, 它们用来报告传感器精确度, 设置数据获取频率和校准传感器.
l Sensor: 我们可以使用该类来创建指定传感器的实例. 它提供了多种方法可以让我们确定传感器的能力.
l SensorEvent: 系统使用该类来创建一个传感器事件对象, 它提供了关于传感器事件的信息. 一个传感器事件对象包含这些信息: 传感器原始数据, 传感器产生的事件, 数据的精度还有事件的时间戳.
l SensorEventListener: 可以使用该接口来创建两个回调方法来接收传感器数值改变或传感器精度改变的提醒(传感器事件).
在一个典型的使用这些传感器相关的APP来完成这两件基本任务:
l 识别传感器和传感器能力: 如果APP拥有某些指定的传感器相关的功能的话, 那么在运行时识别传感器和传感器能力是十分有必要的. 栗如, 我们可能想要识别所有设备中展示的传感器, 并禁用不支持的传感器功能. 同样的, 我们可能想要识别所有的传感器类型, 这样可以有选择的实现传感器, 来保证APP的最佳性能.
l 监测传感器事件: 监测传感器事件是获得传感器原始数据的方法. 一个传感器事件会在每次传感器感知到它测量的参数发生变化的时候发生. 一个传感器事件提供给我们四片信息: 引发该事件的传感器的名字, 事件时间戳, 事件的精度, 还有引发时间的原始数据.
传感器可用性:
传感器可用性会在不同的设备间变化, 也会在不同的Android版本间变化. 这是因为Android的传感器经常夸版本发布. 栗如, 很多传感器在Android1.5中引入, 但是一些在Android2.3之前并没有实现也不可用. 同样的, 一些传感器在Android2.3和Android4.0引入. 两个传感器已经被更好更新的传感器替代.
下表总结了各种传感器在版本更迭中的变化. 这里只列出了4个平台版本, 因为传感器在这些版本中发生了变化. 被列为不推荐使用的传感器仍然可以在随后的平台使用(提供的传感器必须在设备上..).