当前位置:首页 > 嵌入式培训 > 嵌入式学习 > 讲师博文 > Android传感器开发

Android传感器开发 时间:2018-09-28      来源:未知

随着高科技的发展,手机的应用已经渗透到我们生活中的各个方面,手机中的各种应用比如:光线感应,跑步记录仪,摇一摇,地图等各种软件的开发其实都少不了一种开发就是android 传感器的开发。这篇文章将带领大家系统认识传感器的工作原理及开发。

一、Android传感器原理及简介

传感器是一种物理装置或生物器官,能够探测、感受外界的信号、物理条件(如光、热、湿度)或化学组成(如烟雾),并将探知的信息传递给其他装置或器官。标准GB7665-1987对传感器的定义是:“能感受规定的被测量并按照一定的规律转换成可用信号的器件或装置,通常由敏感元件和转换元件组成。”传感器是一种检测装置,能感受被测量的信息,并能将检测感受到的信息,按一定规律转换成为电信号或其他所需形式的信息输出,以满足信息的传输、处理、存储、显示、记录和控制等要求。它是实现自动检测和自动控制的首要环节。

在android系统中,当手机内置传感器检测到外界的环境变化后会引起相应的传感器模块电阻发生变化进而影响手机的部分电流和电量。Google封装提供了对这些硬件操作的API,因此,我们熟练的掌握这些类和方法就可以进行传感器的开发了。

 Android系统所支持的传感器类型

Android感应器Android Sensor是一款能够展示当前手机状态的应用,包括硬件信息、当前位置、加速计、陀螺仪、光感、磁场、定向、电池窗台,声压,同时还可以进行多点触控的测试。

大多数Android设备都会内置传感器,用来测量运动,旋转和环境条件(重力,温度,湿度等),这些传感器可以将采集到的高精度的数据上报给应用程序。们可以将传感器想成是应用程序的外延,帮助我们设计出更加丰富和多元化的应用。Android 系统所支持的传感器类型:

传感器类型表

传感器类型 对应值 传感器名称

TYPE_ACCELEROMETER 1 加速度

TYPE_MAGNETIC_FIELD 2 磁力

TYPE_ORIENTATION 3 方向

TYPE_GYROSCOPE 4 陀螺仪

TYPE_LIGHT 5 光线感应

TYPE_PRESSURE 6 压力

TYPE_TEMPERATURE 7 温度

TYPE_PROXIMITY 8 接近

TYPE_GRAVITY 9 重力

TYPE_GRAVITY 10 线性加速度

 传感器坐标系统

通常情况,传感器框架使用标准的3轴坐标系统来表达数据值。对于大多数传感器,坐标系统是相对与设备被保持在默认方向时的设备的屏幕来定义的。当设备被保持在默认方向时,X轴是水平向右、Y轴是垂直向上、Z轴是指向屏幕面板的外部。在这个系统中,背对着屏幕的Z轴坐标是负值。该坐标系统被加速度传感器、重力传感器、陀螺仪、线性加速度传感器、磁力仪传感器使用

要理解的重要的一点是,在设备屏幕的方向发生变化时,坐标系统的各坐标轴不会发生变化,也就是说传感器的坐标系统不会因设备的移动而改变。这种行为与OpenGL坐标系统的行为相同。

另外要理解的一点是,应用程序不要假设设备的自然(默认)方向是纵向的。对于很多平板设备的自然方向是横向的。传感器坐标系统总基于设备的自然方向。

 Android传感器常用类和接口:

传感器属于Android应用的外延,Android应用不能直接对传感器进行操作,Android对硬件的操作进行了封装,提供给我们一些类和接口,我们通过类和接口来调用方法可以获取传感器上报的数据。Android传感器开发中常用的类和接口有SensorManager、SensorEventListener、Sensor、SensorEvent。顾名思义,SensorManager就是所有传感器的一个综合管理类,包括了传感器的种类、采样率、精准度等。可以通过getSystemService方法来获取一个SensorManager对象。类和接口的作用如下:

Android传感器类和接口

类或接口 作用

SensorManager 1. 获取手机内置传感器列表

2. 注册指定传感器监听器

3. 注销监听器

Sensor 1. 用来表示一个传感器的类

2. 设置传感器的能力

SensorEvent 1. 用来封装传感器上报数据的类

SensorEventListener 1. 用来监听传感器上报数据的监听器接口

 Android传感器的功能

要在Android中使用传感器,首先要了解SensorManager和SensorEventListener。顾名思义,SensorManager就是所有传感器的一个综合管理类,包括了传感器的种类、采样率、精准度等。可以通过getSystemService方法来获取一个SensorManager对象。

代码清单1 获取SensorManager对象

mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);

取得SensorManager对象之后,可以通过getSensorList方法来获取我们所需的传感器类型,保存到一个传感器列表中。

代码清单2 getSensorList

List sensors =

mSensorManager.getSensorList(Sensor.TYPE_ALL);

SensorManager还有很多的常量以及一些常用的方法。

SensorManager常用方法

方法 说明

getDefaultSensor 得到默认的传感器对象

getInclination 得到地磁传感器倾斜角的弧度

getOrientation 得到设备的旋转方向

getSensorList 得到指定传感器的列表

要与传感器进行交互,应用程序必须注册以侦听与一个或多个传感器相关的活动。Android中提供了registerListener来注册一个传感器,并提供了unregisterListener来卸载一个传感器。registerListener方法包括三个参数:第一个参数是接收信号的Listener实例;第二个参数是想接收的传感器类型的列表(上一步创建的List对象);第三个参数为接收频度。调用后返回一个boolean型的值,true表示成功,false表示失败。不再使用以后需进行卸载。

代码清单3 注册和卸载传感器

//注册传感器

Boolean mRegisteredSensor = mSensorManager.registerListener (this, sensor, SensorManager.SENSOR_DELAY_FASTEST);

//卸载传感器

mSensorManager.unregisterListener(this);

其中,SensorEventListener是使用传感器的核心部分,包括以下两个必须实现的方法:  onSensorChanged(SensorEvent event)方法在传感器值更改时调用。该方法只有受此应用程序监视的传感器调用。参数包括一个SensorEvent对象。该对象包括一组浮点数,表示传感器获得的方向、加速度等信息。代码清单4所示的代码可以取得其值。

代码清单4 获取传感器获取信息

float x = event.values[SensorManager.DATA_X];

float y = event.values[SensorManager.DATA_Y];

float z = event.values[SensorManager.DATA_Z];

 onAccuracyChanged(Sensor sensor,int accuracy)方法在传感器的精准度发生改变时调用。参数包括两个整数:一个表示传感器,另一个表示该传感器新的准确值。

二、常用传感器

1. 方向传感器

一般情况下,在Android系统中对应的字段常量是TYPE_ORIENTATION,得到方向传感器在方向传感器中values变量的3个值都表示度数,他们的含义如下:

values[0]:该值表示方位,也就是手机绕着Z轴旋转的角度。0表示北(North);90表示东(East);180表示南(South);270表示西(West)。如果values[0]的值正好是这4个值,并且手机是水平放置,表示手机的正前方就是这4个方向。电子罗盘就是利用这个特性来实现的。

values[1]:该值表示倾斜度,或手机翘起的程度。当手机绕着X轴倾斜时该值发生变化。values[1]的取值范围是-180≤values[1]≤180。假设将手机屏幕朝上水平放在桌子上,这时如果桌子是完全水平的,values[1]的值应该是0(由于很少有桌子是绝对水平的,因此,该值很可能不为0,但一般都是-5和5之间的某个值)。

values[2]:表示手机沿着Y轴的滚动角度。取值范围是-90≤values[2]≤90。假设将手机屏幕朝上水平放在桌面上,这时如果桌面是平的,values[2]的值应为0。将手机左侧逐渐抬起时,values[2]的值逐渐变小,直到手机垂直于桌面放置,这时values[2]的值是-90。将手机右侧逐渐抬起时,values[2]的值逐渐增大,直到手机垂直于桌面放置,这时values[2]的值是90。在垂直位置时继续向右或向左滚动,values[2]的值会继续在-90至90之间变化。

2. 磁力传感器

磁力传感器简称为M-sensor,在Android 中对应的字段常量是TYPE_MAGNETIC_FIELD,该传感器主要读取的是磁场的变化,通过该传感器便可开发出指南针、罗盘等磁场应用。返回x、y、z三轴的环境磁场数据。该数值的单位是微特斯拉(micro-Tesla),用uT表示,单位也可以是高斯(Gauss)。

values[1]:该值表示x方向的磁场分量

values[2]: 该值表示y方向的磁场分量

values[3]: 该值表示z方向的磁场分量

3. 温度传感器

温度传感器返回当前的温度,在Android 中对应的字段常量是TYPE_TEMPERATURE。此传感器返回值只有一个值表示当前温度,单位是摄氏度。

values[0]:当前温度

4. 加速度传感器

加速度传感器用来测量加速度,在Android 中对应的字段常量是TYPE_ACCELEROMETER,在该传感器上获取的values变量的3个元素值分别表示X、Y、Z轴的加速值。例如,水平放在桌面上的手机从左侧向右侧移动,values[0]为负值;从右向左移动,values[0]为正值。读者可以通过本节的例子来体会加速传感器中的值的变化。

values[1]:该值表示x方向的加速度分量

values[2]: 该值表示y方向的加速度分量

values[3]: 该值表示z方向的加速度分量

5. 光传感器

光线传感器用来测量当前环境的光线,在Android 中对应的字段常量是TYPE_LIGHT。values数组只有第一个元素(values[0])有意义。表示光线的强度。大的值是120000.0f。Android SDK将光线强度分为不同的等级,每一个等级的大值由一个常量表示,这些常量都定义在SensorManager类中,代码如代码清单5所示:

代码清单5 光线强度等级

public static final float LIGHT_SUNLIGHT_MAX =120000.0f;

public static final float LIGHT_SUNLIGHT=110000.0f;

public static final float LIGHT_SHADE=20000.0f;

public static final float LIGHT_OVERCAST= 10000.0f;

public static final float LIGHT_SUNRISE= 400.0f;

public static final float LIGHT_CLOUDY= 100.0f;

public static final float LIGHT_FULLMOON= 0.25f;

public static final float LIGHT_NO_MOON= 0.001f;

上面的八个常量只是临界值。读者在实际使用光线传感器时要根据实际情况确定一个范围。例如,当太阳逐渐升起时,values[0]的值很可能会超过LIGHT_SUNRISE,当values[0]的值逐渐增大时,就会逐渐越过LIGHT_OVERCAST,而达到LIGHT_SHADE,当然,如果天特别好的话,也可能会达到LIGHT_SUNLIGHT,甚至更高。

三、传感器开发步骤

所有的程序开发都有一定的逻辑和步骤,传感器的开发也不例外,传感器开发共有3个步骤,下面以加速度传感器为例来演示传感器开发的三个具体步骤:

 1.获取传感器管理器对象、传感器对象,具体代码如代码清单6

代码清单6 获取传感器管理器和传感器对象

//获取传感器管理器 SensorManager

SensorManager sm = (SensorManager) getSystemService(Context.SENSOR_SERVICE);

//获取加速度传感器 Sensor

Sensor accelerometerSensor = sm.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);

 2.定义传感器事件,获取响应数据,具体代码如代码清单7

代码清单7 定义传感器事件获取上报数据

//定义传感器事件监听器

SensorEventListener accelerometerListener = new SensorEventListener() {

//当Sensor上报的数据发生改变时,onSensorChanged被调用

public void onSensorChanged(SensorEvent event) {

//上报的数据会保存在values属性中

float x = event.values[SennsorManager.DATA_X]

float y = event.values[SennsorManager.DATA_Y]

float z = event.values[SennsorManager.DATA_Z]

//x,y,z变量是从加速度传感器获取的数据

}

//当Sensor精度被改变时,onAccuracyChanged被调用

public void onAccuracyChanged(Sensor sensor, int accuracy) {

}

}, mSensor, SensorManager.SENSOR_DELAY_NORMAL, null);

 3.注册(应用)传感器事件,具体代码如代码清单8

代码清单8 定义传感器事件获取上报数据

//在传感器管理器中注册监听器

mSensorManager.registerListener(accelerometerListener, accelerometerSensor,SensorManager.SENSOR_DELAY_NORMAL);

四、开发案例

下面我们将通过两个开发案例来练习传感器的开发使用

 案例一、光传感器的应用

需求:在手机屏幕上实时显示当前环境的光线的强弱值

布局文件里只有一个TextView,非常简单,这里就不再粘贴代码,java代码具体实现代码

如下代码清单9所示:

代码清单9 定义传感器事件获取上报数据

public class MainActivity extends Activity {

TextView textview;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

textview = (TextView) findViewById(R.id.textview);

/**

* 需求:获取特定传感器上的上报数据

* 1.获取特定的传感器

* 2.给传感器设置监听

* 3.获取上报数据

* */

//获取特定的传感器:通过管理器找到特定的传感器

SensorManager sm = (SensorManager) getSystemService(SENSOR_SERVICE);

//获取光传感器

Sensor lightSensor = sm.getDefaultSensor(Sensor.TYPE_LIGHT);

//给传感器注册监听器

/**

* 第一个参数:传感器的监听器

* 第二个参数:给哪个传感器设置监听

* 第三个参数:采样率,即多久进行一次采样

* */

sm.registerListener(new MyListener(), lightSensor, SensorManager.SENSOR_DELAY_NORMAL);

}

/**

* 传感器的监听器,可以监听传感器的数据变化,上报数据

* */

class MyListener implements SensorEventListener{

/**

* 传感器上报数据发生变化时调用的方法

* */

@Override

public void onSensorChanged(SensorEvent event) {

//获取上报数据的数组,在光线传感器中只有一个values[0],代表了当前光线强度

float[] values = event.values;

textview.setText("当前光线为:"+values[0]);

}

/**

* 传感器精度发生变化时调用的方法

* */

@Override

public void onAccuracyChanged(Sensor sensor, int accuracy) {

// TODO Auto-generated method stub

}

}

}

这里只是举例一个非常简单的利用光传感器的案例,读者有兴趣还可以实现通过加速度传感器实现摇一摇的功能。

上一篇:学习Linux一点心得

下一篇:实现一键退出所有的activity

热点文章推荐
华清学员就业榜单
高薪学员经验分享
热点新闻推荐
前台专线:010-82525158 企业培训洽谈专线:010-82525379 院校合作洽谈专线:010-82525379 Copyright © 2004-2022 北京华清远见科技集团有限公司 版权所有 ,京ICP备16055225号-5京公海网安备11010802025203号

回到顶部