《第一行代码Android》学习日记20——传感器应用

来源:互联网 发布:淘宝网店客服怎么做 编辑:程序博客网 时间:2024/05/01 20:22

1.传感器简介
手机中内置的传感器是一种微型的物理设备,它更够探测、感受外界的信号,并按照一定的规律转换成我们所需要的信息。Android手机通常会支持多种类型的传感器,这里共分为3个大类:动作(motion)传感器、环境(environment)传感器、位置(position)传感器。
其中动作传感器是在三个轴(X、Y、Z)上测量加速度和旋转角度,包括加速(accelerometer)传感器、重力(gravity)传感器、陀螺仪(gyroscope)传感器、旋转向量(rotational vector )传感器。
环境传感器可以测量不同环境的参数,例如,周围环境的空气温度和压强、光照强度和湿度。包括湿度(barometer)传感器、光线(photometer)传感器、温度(thermometer)传感器。位置传感器可以测量设备的物理位置,包括方向(orientation)传感器、磁力(magnetometer)传感器。
所有的常量都在Sensor类中定义。TYPE_ACCELEROMETER:加速传感器(硬件传感器)TYPE_AMBIENT_TEMPERATURE:温度传感器(硬件传感器)TYPE_GRAVITY:重力传感器(硬件或软件传感器)TYPE_GYROSCOPE:陀螺仪传感器(硬件传感器)TYPE_LIGHT:光线传感器(硬件传感器)TYPE_LINEAR_ACCELERATION:线性加速传感器(硬件或软件传感器)TYPE_MAGNETIC_FIELD:磁场传感器(硬件传感器)
TYPE_ORIENTATION:方向传感器(软件传感器),数据来自重力和磁场传感器TYPE_PRESSURE:压力传感器(硬件传感器)TYPE_PROXIMITY:临近传感器(硬件传感器)TYPE_RELATIVE_HUMIDITY:湿度传感器(硬件传感器)TYPE_ROTATION_VECTOR:旋转向量传感器(硬件或软件传感器)TYPE_TEMPERATURE:温度传感器(硬件传感器),从Android4.0(API Level = 14)开始被TYPE_AMBIENT_TEMPERATURE取代。

SensorManager类:用于创建sensor service的实例。该类提供了很多用于访问和枚举传感器,注册和注销传感器监听器的方法。而且还提供了与传感器精度、扫描频率、校正有关的常量。Sensor类:提供了一些用于获取传感器技术参数的方法。如版本、类型、生产商等。SensorEvent类:系统使用该类创建传感器事件对象。该对象可以提供与传感器事件有关的信息。传感器事件对象包括的信息有原始的传感器回传数据、传感器类型、数据的精度以及触发事件的时间。SensorEventListener接口:该接口包含两个回调方法,当传感器的回传值或精度发生变化时,系统会调用这两个回调方法。
2.搜索手机上带有的传感器
创建ListSensor项目,修改activity_main.xml代码,设置一个textView控件,用于显示手机中传感器的名称。
这里写图片描述
修改MainActivity代码,我们在OnCreate()方法中获取到了TextView控件的实例,之后获取到系统所有传感器的管理器SensorManager的实例,遍历出设备所有类型的传感器,并将它们的名字输出到列表之中。
这里写图片描述
3.光照传感器
编写一个简易的光照探测器程序,使得手机可以检测到周围环境的光照强度。新建一个LightSensorTest项目,修改activity_main.xml代码。传入一个TextView控件,用于显示当前的光照强度。
这里写图片描述
修改MainActivity的代码,在onCreate()方法中获取TextView控件的实例,之后获取到SensorManager的实例,调用getDefaultSensor()方法的到光照传感器,即Sensor.TYPE_LIGHT。之后我们调用SensorEventListener对传感器输出的信号类型进行监听,在这之前我们需要调用SensorManager的registerListener()方法来注册SensorEventListener使其生效,此方法接收三个参数,第一个是SensorEventListener的实例,第二个是Sensor的实例,第三个是用于表示传感器输出信息的更新速率。当程序退出或传感器使用完毕时,在onDestroy()方法中调用unregisterListener()方法将使用的资源放掉。SensorEventListener包含两个方法,当传感器的值发生变化时,调用onSensorChanged()方法,当传感器的精度发生变化时调用onAccuracyChanged()方法。
这里写图片描述
4.加速度传感器
在这里利用加速度传感器模仿微信的摇一摇功能。检测手机在X轴、Y轴和Z轴上的加速度,当达到预定值的时候就可以认为用户摇动了手机,从而触发了摇一摇逻辑。由于重力加速度的存在,即是手机在静止的情况下,某一个轴上的加速度有可能达到9.8米每秒二次方,因此设定预设值为15米每秒二次方。
新建项目AccelerometerSensorTest项目,修改MainActivity代码,在onSensorChanged()方法中分别获取到X轴、Y轴和Z轴方向上的加速度值,由于加速度可能是负值,这里对其进行绝对值处理。之后进行判断,如果手机在X轴、Y轴和Z轴上的加速度值大于15米每秒的二次方,就认为用户摇动了手机,从而触发摇一摇逻辑,弹出一个Toast。
这里写图片描述
5.使用方向传感器,制作指南针
方向传感器的使用比其他传感器更为广泛,它能够准确判断出手机在各个方向上的旋转角度,用于指南针、地平仪等工具程序。下面我们检测到手机围绕Z轴的旋转角度,对这个值进行处理,实现指南针原理。
新建CompassTest项目,修改MainActivity代码,在onCreate()方法中获取到加速度传感器和地磁传感器的实例,并给它们注册了监听器。之后在onSensorChanged()方法中进行判断,如果当前SensorEvent中包含的是加速度传感器,就将values数组赋值给accelerometerValues数组,如果当前SensorEvent中包含的是地磁传感器,就将values数组赋值给magneticValues数组。注意在赋值的时候要调用以下values数组的clone()方法,不然accelerometerValues和magneticValues将会指向同一个引用。
之后我们分别创建一个长度为9的R数组和一个长度为3的values数组,调用getRotationMatrix()方法为R数组赋值,再调用getOrientation()方法为values数组赋值,这是values中就已经包含手机在所有方向上旋转的弧度了。其中values[0]表示手机围绕Z轴旋转的弧度,这里我们用Math.yoDegrees()方法将其转换为角度,并打印出来。
这里写图片描述
这里写图片描述
这里写图片描述
运行程序,围绕Z轴旋转手机,旋转的角度会打印在LogCat上。

我们加入罗盘和指针来完善CompassTest项目。修改activity_main.xml文件,在布局中加入ImageView两个控件,用于显示指南针的背景和指针。
这里写图片描述
修改MainActivity的代码,在onCreate()方法中获取ImageView的实例,用于显示指南针的背景图。之后在onSensorChanged()方法中使用旋转动画技术,创建一个RotateAnimation实例,给它的构造方法传入六个参数,第一个参数标志旋转的起始角度,第二个参数表示旋转的终止角度,后面四个参数用于指定旋转的中心点。这里讲从传感器获取到的旋转角度取反,传递给RotateAnimation,并指定旋转的中心点为指南针背景图的中心,之后调用ImageView的startAnimation()方法来执行旋转动画。
这里写图片描述
这里写图片描述
运行程序,旋转手机,指南针的背景图会跟着一起转动。

0 0