Android传感器开发完全解析

本文由郭朝投稿。

郭朝的博客      1Android的三大类传感器

Android传感器按大方向划分大致有这么三类传感器:动作(Motion)传感器、环境(Environmental)传感器、位置(Position)传感器。

(1)动作传感器

这类传感器在三个轴(x、y、z)上测量加速度和旋转角度。包括如下几个传感器:

加速(accelerometer)传感器

重力(gravity)传感器

陀螺仪(gyroscope)传感器

旋转向量(rotationalvector)传感器

下面来看一下传感器世界的坐标系:

是不是已经有点感觉了。

(2)环境传感器

这类传感器可以测量不同环境的参数,例如,周围环境的空气温度和压强、光照强度和湿度。包括如下几个传感器:

湿度(barometer)传感器

光线(photometer)传感器

温度(thermometer)传感器

()位置传感器

这类传感器可以测量设备的物理位置。包括如下几个传感器:

方向(orientation)传感器

磁力(magnetometer)传感器

了解后我们就开始进入传感器的编程工作了,接下来我们看一下Android为我们提供的传感器框架(Androidsensorframework,简称ASF)。

      2Android传感器框架

AndroidSDK为我们提供了ASF,可以用来访问当前Android设备内置的传感器。ASF提供了很多类和接口,帮助我们完成各种与传感器有关的任务。例如:

1)确定当前Android设备内置了哪些传感器。

2)确定某一个传感器的技术指标。

)获取传感器传回来的数据,以及定义传感器回传数据的精度。

4)注册和注销传感器事件监听器,这些监听器用于监听传感器的变化,通常从传感器回传的数据需要利用这些监听器完成。

ASF允许我们访问很多传感器类型,这些传感器有一些是基于硬件的传感器,还有一些是基于软件的传感器。基于硬件的传感器就是直接以芯片形式嵌入到Android设备中,这些传感器直接从外部环境获取数据。基于软件的传感器并不是实际的硬件芯片,基于软件的传感器传回的数据本质上也来自于基于硬件的传感器,只是这些数据通常会经过二次加工。所以基于软件的传感器也可以称为虚拟(virtual)传感器或合成(synthetic)传感器。

Android对每个设备的传感器都进行了抽象,其中SensorManger类用来控制传感器,Sensor用来描述具体的传感器,SensorEventListener用来监听传感器值的改变。

(1)SensorManager类

用于创建sensorservice的实例。该类提供了很多用于访问和枚举传感器,注册和注销传感器监听器的方法。而且还提供了与传感器精度、扫描频率、校正有关的常量。

(2)Sensor类

Sensor类为我们提供了一些用于获取传感器技术参数的方法。如版本、类型、生产商等。例如所有传感器的TYPE类型如下:

序号传感器Sensor类中定义的TYPE常量1加速度传感器TYPE_ACCELEROMETER2温度传感器TYPE_AMBIENT_TEMPERATURE陀螺仪传感器TYPE_GYROSCOPE4光线传感器TYPE_LIGHT5磁场传感器TYPE_MAGNETIC_FIELD6压力传感器TYPE_PRESSURE7临近传感器TYPE_PROXIMITY8湿度传感器TYPE_RELATIVE_HUMIDITY9方向传感器TYPE_ORIENTATION10重力传感器TYPE_GRAVITY11线性加速传感器TYPE_LINEAR_ACCELERATION12旋转向量传感器TYPE_ROTATION_VECTOR

注意:1-8是硬件传感器,9是软件传感器,其中方向传感器的数据来自重力和磁场传感器,10-12是硬件或软件传感器。

()SensorEvent类

系统使用该类创建传感器事件对象。该对象可以提供与传感器事件有关的信息。传感器事件对象包括的信息有原始的传感器回传数据、传感器类型、数据的精度以及触发事件的时间。

(4)SensorEventListener接口

该接口包含两个回调方法,当传感器的回传值或精度发生变化时,系统会调用这两个回调方法。

到了这里,我们就可以进行传感器开发工作了。

      获取传感器技术参数

下来我们编写代码来获取一下自己手机的传感器技术参数。

先运行一下看看效果:

貌似我的手机传感器还不少,哈哈。注意此处必须用实体机测试哦。

下来我们分别看一下动作传感器、环境传感器和位置传感器的组成及使用方法。

      4动作传感器的组成及使用方法

所有的动作传感器都会返回三个浮点数的值(通过长度为的数组返回),但对于不同的传感器,这三个只是意义不同。

例如,对于加速传感器,会返回三个坐标轴的数据。对于陀螺仪传感器,会返回三个坐标轴的旋转角速度。

注意:动作传感器本身一般并不会用于监测设备的位置,关于设备的位置需要用其他类型的传感器进行监测,例如,磁场传感器。

(1)加速度传感器

加速度传感器需要结合重力传感器使用,以减少加速度受重力的影响。首先需要实现SensorEventListener接口,添加回调方法,然后获取传感器SensorManager对象,注册传感器,然后我们就可以监听传感器的变化了。示例代码如下:

看一下效果图:

我们可以看到正值和负值,那什么情况是正值?什么情况是负值呢?

设备从左到右推动,x轴加速度为正值。

设备朝着自己推动,y轴加速度为正值。

如果由底部朝着顶部以am/s^2的加速度推动,那么Z轴的加速度为a+9.81,所以如果计算实际的加速度(抵消重力加速度),需要减9.81。

      5位置传感器的组成及使用方法

Android提供了磁场传感器和方向传感器用于确定设备的位置,还提供了测量设备正面到某一个邻近物体距离的传感器(邻近传感器)。

邻近传感器在手机中很常见。像接听电话时手机屏幕灭屏就是使用的邻近传感器。方向传感器是基于软件的,该传感器的回传数据来自加速度传感器和磁场传感器。

位置传感器对于确定设备在真实世界中的物理位置非常有用。例如,可以组合磁场传感器和加速度传感器测量设备相对于地磁北极的位置,还可以利用方向传感器确定当前设备相对于自身参照系的位置。

磁场传感器和方向传感器都返回值个值(SensorEvent.values),而邻近传感器只返回1个值。

下面我们具体看一下他们的返回值:

方向传感器:

SensorEvent.values[0]:绕着Z轴旋转的角度。如果Y轴(正常拿手机的方向)正对着北方,该值是0,如果Y轴指向南方,改值是,Y轴指向东方,该值是90,如果Y轴指向西方,该值是。

SensorEvent.values[1]:绕着X轴旋转的度数。当从Z轴正方向朝向Y轴正方向,改值为正值。反之,为负值。该值在至-之间变动。

SensorEvent.values[2]:绕着Y轴旋转的度数。当从Z轴正方向朝向X轴正方向,改值为正值。反之,为负值。该值在至-之间变动。

磁场传感器:

SensorEvent.values[0]:沿着X轴的磁力(μT,millitesla)

SensorEvent.values[1]:沿着Y轴的磁力(μT,millitesla)

SensorEvent.values[2]:沿着Y轴的磁力(μT,millitesla)

邻近传感器:

SensorEvent.values[0]:手机正面距离邻近物理的距离(CM)

(1)临近传感器

这里以临近传感器作为示例工程实现一下,其他传感器实现大同小异。

运行程序,我间断的挡住临近传感器,看一下效果图:

0.0是我挡住临近传感器时候的值,8.0是我将手移开时的值。

下面我们再来看一个比较叼的传感器,与自然息息相关。

      6环境传感器的组成及使用方法

Android提供了用于检测不同的外部环境的传感器。例如,可以检测周围空气的湿度、光线、空气的压强和温度,这些传感器都是基于硬件的传感器。除了光线传感器外,其他传感器在普通的Android设备中很少见。所以如果使用环境传感器,最好运行时对当前Android设备所支持的传感器进行检测。

(1)环境传感器的返回值

大多数动作传感器和位置传感器都返回多个值,而所有的环境传感器都只返回一个值:

传感器TYPE值返回值单位温度传感器TYPE_AMBIENT_TEMPERATUREevent.values[0]°C压力传感器TYPE_PRESSUREevent.values[0]hPa光线传感器TYPE_LIGHTevent.values[0]lx湿度传感器TYPE_RELATIVE_HUMIDITYevent.values[0]RH(%)

注意:环境传感器返回的值很少受到杂音的干扰,而动作和位置传感器经常需要消除杂音的影响。例如,加速度传感器要消除重力对其回传值的影响。

(2)光线传感器回传数据

环境传感器的使用方法与动作、位置传感器大同小异,在次不再赘述。

如果你有好的文章想和大家分享,欢迎投稿,直接向我投递文章链接即可。

欢迎长按下图-识别图中







































全国白癜风医院排名
北京看白癜风多少钱



转载请注明地址:http://www.henanledxianshiping.com/ithyfzqj/6229.html
  • 上一篇文章:
  • 下一篇文章: