传感器定义:一种物理设备或者生物器官,能够探测、感受外界的信号,物理条件(如光,热, 湿度)或化学组成(如烟雾),并将探知的信息传递给其他的设备或者器官。
传感器分类:
- 运动传感器:测量加速度和旋转力,包括加速度计,重力传感器,陀螺仪和旋转矢量传感器。
- 环境传感器:测量各种周围环境情况,如环境温度、气压、光强、湿度等。包括气压计,光度计和温度计。
- 位置传感器:测量设备的物理位置信息,包括方向传感器和磁力计。
传感器开发框架:
SensorManager:创建传感器服务的实例。这个类提供了多种方法来访问和列出传感器,注册和注销传感器事件监听器,并获取方向信息。该类还提供了几个传感器常量,用于报告传感器的精度,设置数据采集速率和校准传感器。
// 获取传感器服务
mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
Sensor:创建特定的传感器实例。这个类提供了各种方法,让你确定一个传感器的能力。
List<Sensor> list = mSensorManager.getSensorList(Sensor.TYPE_ACCELEROMETER);
传感器类型:
Sensor.TYPE_ACCELEROMETER:加速度传感器
Sensor.TYPE_GRAVITY:重力传感器
Sensor.TYPE_ORIENTATION:方向传感器
Sensor.TYPE_GYROSCOPE:陀螺仪传感器
Sensor.TYPE_MAGNETIC_FIELD:磁场传感器
Sensor.TYPE_LINEAR_ACCELERATION:线性加速度传感器
Sensor.TYPE_AMBIENT_TEMPERATURE:环境温度传感器
SensorEvent:创建传感器事件对象,该对象提供有关传感器事件的信息。传感器事件对象包括以下信息:原始传感器数据,生成事件的传感器类型,数据的准确性以及事件的时间戳。
SensorEventListener:创建两种回传方法,当传感器值更改或传感器准确度发生变化时,会接收通知(传感器事件)。
传感器数据读取步骤:
1、获取传感器信息,需要一下步骤:
- 获取传感器管理器:Android提供了一个sensorManager管理器,通过这个类可以获取到都有哪些传感器。具体代码如下:
mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
- 获取设备的传感器列表:通过sensorManager管理器的getSensorList()方法,可以获取传感器对象列表,具体代码如下:
List<Sensor> list = mSensorManager.getSensorList(Sensor.TYPE_ACCELEROMETER);
- 迭代获取Sensor对象,调用对应方法获取相关信息:
2、获取传感器传回的数据:
- 获取传感器管理器:
mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
- 调用特定方法获得需要的传感器:调用SensorManager 对象的getDefaultSensor方法,获取指定类型的传感器,例如这里使用光线传感器,具体代码:
Sensor sensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION);
- 实现SensorEventListener接口,重写onSensorChanged和onAccuracyChanged方法:
- onSensorChanged(SensorEvent event):该方法在传感器的值发生改变的时候调用,其参数是一个SensorEvent 对象,通过该对象的values属性可以获取传感器的值,该值是一个数组,该变量最多有三个元素,而且传感器不同,对应元素代表的含义也不同
- onAccuracyChanged(Sensor sensor , int accuracy):当传感器的进度发生改变时会回调,参数说明:
sensor:传感器对象
accuracy:表示传感器新的精度
private SensorEventListener mSensorEventListener = new SensorEventListener(){
// 当有新的传感器事件时调用
@SuppressLint("NewApi")
@Override
public void onSensorChanged(SensorEvent event){
String time = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS"));
// X、Y、Z轴的加速度
String msg = String.format(Locale.ENGLISH, "%+8.4f, %+8.4f, %+8.4f",event.values[0], event.values[1], event.values[2]);
data.setText(msg);
}
// 当注册传感器的精度发生变化时调用
@Override
public void onAccuracyChanged(Sensor sensor, int i) {}
};
- SensorManager对象调用registerListener注册监听器:通过调用sensorManager对象的registerListener()方法来注册监听事件。具体代码:
mSensorManager.registerListener(mSensorEventListener, mSensor, SensorManager.SENSOR_DELAY_FASTEST);
第一个参数是上下文对象,第二个是传感器对象,第三个是传感器的延时时间的精密程度,越精密越耗电。
精密程度的类型:
- SENSOR_DELAY_FASTEST——延时:0ms
- SENSOR_DELAY_GAME——延时:20ms
- SENSOR_DELAY_UI——延时:60ms
- SENSOR_DELAY_NORMAL——延时:200ms
- 监听器注销:
mSensorManager.unregisterListener(this);