1.传感器使用场景
Android传感器按大方向划分大致有这么三类传感器:动作(Motion)传感器、环境(Environmental)传感器、位置(Position)传感器。
(1)动作传感器
这类传感器在三个轴(x、y、z)上测量加速度和旋转角度。包括如下几个传感器:
加速(accelerometer)传感器、重力(gravity)传感器、陀螺仪(gyroscope)传感器、旋转向量(rotational vector )传感器
(2)环境传感器
这类传感器可以测量不同环境的参数,例如,周围环境的空气温度和压强、光照强度和湿度。包括如下几个传感器:
湿度(barometer)传感器、光线(photometer)传感器、温度(thermometer)传感器
(3)位置传感器
这类传感器可以测量设备的物理位置。包括如下几个传感器:
方向(orientation)传感器、磁力(magnetometer)传感器
了解后我们就开始进入传感器的编程工作了,接下来我们看一下Android为我们提供的传感器框架(Android sensor framework,简称ASF)。
Android传感器框架
Android SDK为我们提供了ASF,可以用来访问当前Android设备内置的传感器。ASF提供了很多类和接口,帮助我们完成各种与传感器有关的任务。例如:
1)确定当前Android设备内置了哪些传感器。
2)确定某一个传感器的技术指标。
3)获取传感器传回来的数据,以及定义传感器回传数据的精度。
4)注册和注销传感器事件监听器,这些监听器用于监听传感器的变化,通常从传感器回传的数据需要利用这些监听器完成。
ASF允许我们访问很多传感器类型,这些传感器有一些是基于硬件的传感器,还有一些是基于软件的传感器。基于硬件的传感器就是直接以芯片形式嵌入到Android设备中,这些传感器直接从外部环境获取数据。基于软件的传感器并不是实际的硬件芯片,基于软件的传感器传回的数据本质上也来自于基于硬件的传感器,只是这些数据通常会经过二次加工。所以基于软件的传感器也可以称为虚拟(virtual)传感器或合成(synthetic)传感器。
Android对每个设备的传感器都进行了抽象,其中SensorManger类用来控制传感器,Sensor用来描述具体的传感器,SensorEventListener用来监听传感器值的改变。
2.传感器中方法的介绍
(1)SensorManager类
用于创建sensor service的实例。该类提供了很多用于访问和枚举传感器,注册和注销传感器监听器的方法。而且还提供了与传感器精度、扫描频率、校正有关的常量。
(2)Sensor类
Sensor类为我们提供了一些用于获取传感器技术参数的方法。如版本、类型、生产商等。例如所有传感器的TYPE类型如下:
❤注意:1-8是硬件传感器,9是软件传感器,其中方向传感器的数据来自重力和磁场传感器,10-12是硬件或软件传感器。
(3)SensorEvent类
系统使用该类创建传感器事件对象。该对象可以提供与传感器事件有关的信息。传感器事件对象包括的信息有原始的传感器回传数据、传感器类型、数据的精度以及触发事件的时间。
(4)SensorEventListener接口
该接口包含两个回调方法,当传感器的回传值或精度发生变化时,系统会调用这两个回调方法。
3.传感器服务(onCreate)
//震动管理器
vibrator = (Vibrator) getSystemService(VIBRATOR_SERVICE);
//创建一个SensorManager来获取系统的传感器服务
sensor = (SensorManager) getSystemService(SENSOR_SERVICE);
List<Sensor> list = sensor.getSensorList(Sensor.TYPE_ALL);
for (int i = 0; i < list.size(); i++) {
String name = list.get(i).getName();
Log.e(TAG, "onCreate: " + name);
}
4.加速度传感器(摇一摇)
onResume
/* * 最常用的一个方法 注册事件
* * 参数1 :传感器的监听器
* * 参数2 :待监听的传感器
* * 参数3 :模式 可选数据变化的刷新频率,多少微秒取一次。
* * SensorManager.SENSOR_DELAY_FASTEST:最快,延迟最小。
* * SensorManager.SENSOR_DELAY_GAME:适合游戏的频率。
* * SensorManager.SENSOR_DELAY_NORMAL:正常频率。
* * SensorManager.SENSOR_DELAY_UI:适合普通用户界面UI变化的频率。 * */
//加速度传感器
sensor.registerListener(this,
sensor.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),
SensorManager.SENSOR_DELAY_NORMAL);
onSensorChanged
int type = event.sensor.getType();
if (type == Sensor.TYPE_ACCELEROMETER) {
float x = event.values[0];
tvx.setText("x轴加速度:" + x);
float y = event.values[1];
tvy.setText("y轴加速度:" + y);
float z = event.values[2];
tvz.setText("z轴加速度:" + z);
//摇一摇
if (Math.abs(x) > 12 || Math.abs(y) > 12 || Math.abs(z) > 12) {
MediaPlayer player = MediaPlayer.create(this, R.raw.weichat_audio);
player.start();
//这里使用的是一个长整型数组,数组的a[0]表示静止的时间,a[1]代表的是震动的时间,然后数组的a[2]表示静止的时间,a[3]代表的是震动的时间……依次类推下去,然后这里的代码有一点小小的改变:
long[] patter = {1000, 1000, 2000, 50};
vibrator.vibrate(patter, -1);
}
5.方向传感器(指南针)
sensor.registerListener(this,
sensor.getDefaultSensor(Sensor.TYPE_ORIENTATION),
SensorManager.SENSOR_DELAY_NORMAL);
float z = event.values[0];
float x = event.values[1];
float y = event.values[2];
tvx2.setText("绕x轴转过的角度:" + x);
tvy2.setText("绕y轴转过的角度" + y);
tvz2.setText("绕z轴转过的角度" + z);
6.光传感器(屏幕遮挡)
sensor.registerListener(this,
sensor.getDefaultSensor(Sensor.TYPE_LIGHT),
SensorManager.SENSOR_DELAY_NORMAL);
float x = event.values[0];
tvx3.setText("光强度:"+x);
网友评论