知识要点:
1 传感器的简介及分类
1.1传感器的概述及应用场景
1.2传感器分类介绍
2 方向传感器获取参数的实现
2.1 SensorEvent类
2.2 SensorEventListener接口
2.3 SensorManager
2.4 每种传感器对应的常量值
案例:微信摇一摇、指南针
一.Android的三大类传感器
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用来监听传感器值的改变。
(1)SensorManager类
用于创建sensor service的实例。该类提供了很多用于访问和枚举传感器,注册和注销传感器监听器的方法。而且还提供了与传感器精度、扫描频率、校正有关的常量。
(2)Sensor类
Sensor类为我们提供了一些用于获取传感器技术参数的方法。如版本、类型、生产商等。例如所有传感器的TYPE类型如下:
(3)SensorEvent类
系统使用该类创建传感器事件对象。该对象可以提供与传感器事件有关的信息。传感器事件对象包括的信息有原始的传感器回传数据、传感器类型、数据的精度以及触发事件的时间
(4)SensorEventListener接口
/**
* 传感器精度变化时回调
*/
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}
/**
* 传感器数据变化时回调
*/
@Override
public void onSensorChanged(SensorEvent event) {
}
三.获取传感器技术参数
下来我们编写代码来获取一下自己手机的传感器技术参数。
//获取到传感器
mManager = (SensorManager) getSystemService(SENSOR_SERVICE);
List sensorList = mManager.getSensorList(Sensor.TYPE_ALL);
for (int i = 0; i < sensorList.size(); i++) {
Sensor sensor = sensorList.get(i);
Log.d(TAG, "onCreate: " + sensor.getName());
}
在onStart中注册传感器
@Override
protected void onStart() {
super.onStart();
/*
* 最常用的一个方法 注册事件
* 参数1 :SensorEventListener监听器
* 参数2 :Sensor 一个服务可能有多个Sensor实现,此处调用getDefaultSensor获取默认的Sensor
* 参数3 :模式 可选数据变化的刷新频率,多少微秒取一次。
* */
//加速度传感器
mManager.registerListener(this, mManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),
SensorManager.SENSOR_DELAY_NORMAL);
//方向传感器
mManager.registerListener(this, mManager.getDefaultSensor(Sensor.TYPE_ORIENTATION)
, SensorManager.SENSOR_DELAY_NORMAL);
//光感传感器
mManager.registerListener(this, mManager.getDefaultSensor(Sensor.TYPE_LIGHT),
SensorManager.SENSOR_DELAY_NORMAL);
}
onStop要注销
@Override
protected void onStop() {
super.onStop();
mManager.unregisterListener(this);
}
具体代码形式如下一看就懂啦:
public class MainActivity extends AppCompatActivity implements SensorEventListener {
private static final String TAG = "MainActivity";
private SensorManager mManager;
private TextView mTv1;
private TextView mTv2;
private TextView mTv3;
private Vibrator mVibrator;
private TextView mTv4;
private TextView mTv5;
private TextView mTv6;
private TextView mTv7;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
mManager = (SensorManager) getSystemService(SENSOR_SERVICE);
List sensorList = mManager.getSensorList(Sensor.TYPE_ALL);
for (int i = 0; i < sensorList.size(); i++) {
Sensor sensor = sensorList.get(i);
Log.d(TAG, "onCreate: " + sensor.getName());
}
}
@Override
protected void onStart() {
super.onStart();
/*
* 最常用的一个方法 注册事件
* 参数1 :SensorEventListener监听器
* 参数2 :Sensor 一个服务可能有多个Sensor实现,此处调用getDefaultSensor获取默认的Sensor
* 参数3 :模式 可选数据变化的刷新频率,多少微秒取一次。
* */
//加速度传感器
mManager.registerListener(this, mManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),
SensorManager.SENSOR_DELAY_NORMAL);
//方向传感器
mManager.registerListener(this, mManager.getDefaultSensor(Sensor.TYPE_ORIENTATION)
, SensorManager.SENSOR_DELAY_NORMAL);
//光感传感器
mManager.registerListener(this, mManager.getDefaultSensor(Sensor.TYPE_LIGHT),
SensorManager.SENSOR_DELAY_NORMAL);
}
@Override
protected void onStop() {
super.onStop();
mManager.unregisterListener(this);
}
/**
* 传感器数据变化时回调
*/
@Override
public void onSensorChanged(SensorEvent event) {
//所有的传感器都是通过这个回调方法获取数据
//event.accuracy 精度
//event.sensor,传感器的数据
//event.timestamp,时间戳
//event.values 值
Sensor sensor = event.sensor;
//判断是那种类型的传感器数据
if (sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
float x = event.values[0];
float y = event.values[1];
float z = event.values[2];
mTv1.setText("x轴的加速度:" + x);
mTv2.setText("y轴的加速度:" + y);
mTv3.setText("z轴的加速度:" + z);
//摇一摇实现的逻辑
if (Math.abs(x) > 20 || Math.abs(y) > 20 || Math.abs(z) > 20) {
//出发摇一摇功能
yaoYiYao();
}
} else if (sensor.getType() == Sensor.TYPE_ORIENTATION) {
//绕z轴转过的角度为0/360时大概指向正北
float z = event.values[0];
float x = event.values[1];
float y = event.values[2];
mTv4.setText("绕z轴转过的角度:" + z);
mTv5.setText("绕x轴转过的角度:" + x);
mTv6.setText("绕y轴转过的角度:" + y);
} else if (sensor.getType() == Sensor.TYPE_LIGHT) {
float light = event.values[0];
mTv7.setText("光线强度:"+light);
}
}
private void yaoYiYao() {
//音效
MediaPlayer mediaPlayer = MediaPlayer.create(this, R.raw.weichat_audio);
mediaPlayer.start();
//震动
//获取Vibrator震动服务
mVibrator = (Vibrator) getSystemService(VIBRATOR_SERVICE);
//方式1
//mVibrator.vibrate(1000);//振动一秒
//方式2
//这里使用的是一个长整型数组,数组的a[0]表示静止的时间,
// a[1]代表的是震动的时间,然后数组的a[2]表示静止的时间,
// a[3]代表的是震动的时间……依次类推下去,然后这里的代码有一点小小的改变:
long[] patter = {1000, 1000, 2000, 100};
mVibrator.vibrate(patter, -1);
}
/**
* 传感器精度变化时回调
*/
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}
private void initView() {
mTv1 = (TextView) findViewById(R.id.tv1);
mTv2 = (TextView) findViewById(R.id.tv2);
mTv3 = (TextView) findViewById(R.id.tv3);
mTv4 = (TextView) findViewById(R.id.tv4);
mTv5 = (TextView) findViewById(R.id.tv5);
mTv6 = (TextView) findViewById(R.id.tv6);
mTv7 = (TextView) findViewById(R.id.tv7);
}
}