目录
因为有许多传感器已经被手机生产商摒弃,所以我写了这篇文章未记录还常见的可用传感器。
光强、加速度、磁场、陀螺仪、接近、线性加速度、未校准磁场、未校准陀螺仪。
1. 传感器基础步骤
(1) 获取传感器管理者 SensorManager
SensorManager sensorManager= (SensorManager)context.getSystemService(Context.SENSOR_SERVICE);
(2) 获取传感器Sensor
//此处以光传感器为例
Sensor sensor=sensorManager.getDefaultSensor(Sensor.TYPE_LIGHT);
(3) 判断传感器是否为空,并注册监听
注册监听方法的三个参数为:传感器事件监听器,传感器对象,检测频率(SensorManager.SENSOR_DELAY_NORMAL为默认频率)
if(sensor!=null){
//传感器不为空
sensorManager.registerListener(new SensorEventListener() {
public void onSensorChanged(SensorEvent sensorEvent) {
// 数值变化
}
public void onAccuracyChanged(Sensor sensor, int i) {
// 传感器精度发生变化时的回调方法
}
}, sensor, SensorManager.SENSOR_DELAY_NORMAL);
}
2. 光强传感器
//传感器管理者
SensorManager sensorManager= (SensorManager) view.getContext().getSystemService(Context.SENSOR_SERVICE);
//传感器
Sensor sensor=sensorManager.getDefaultSensor(Sensor.TYPE_LIGHT);
if(sensor!=null){
//传感器不为空
sensorManager.registerListener(new SensorEventListener() {
public void onSensorChanged(SensorEvent sensorEvent) {
// 数值变化
// 光强度发生变化时的处理逻辑
float lightIntensity = sensorEvent.values[0];
}
public void onAccuracyChanged(Sensor sensor, int i) {
// 传感器精度发生变化时的回调方法
}
}, sensor, SensorManager.SENSOR_DELAY_NORMAL);
}
3. 加速度传感器,磁场传感器,陀螺仪
在新的 API 中,方向传感器已经被拆分成更细粒度的传感器。
1 - 加速度计(Accelerometer):
Sensor.TYPE_ACCELEROMETER
提供设备在三个轴上的加速度信息,即设备在空间中的线性加速度。通过这个传感器,你可以检测设备的摇晃、倾斜等动作。
2 - 磁力计(Magnetic Field):
Sensor.TYPE_MAGNETIC_FIELD
提供设备周围磁场的信息。这个传感器可以用来获取设备相对于地球磁场的方向,帮助计算设备的方向。
3 - 陀螺仪(Gyroscope):
Sensor.TYPE_GYROSCOPE
提供设备在三个轴上的角速度信息,即设备的旋转速度。通过这个传感器,你可以检测设备的旋转动作。
(1) 加速度传感器与磁场传感器配合计算翻转角度与方向
获取翻转角度需要加速度传感器与磁场传感器的配合。
方向角:取值为0到2π。0度指的是设备的正北方向,90度是正东,180度是正南,270度是正西。
俯仰角:取值为-π/2到π/2。屏幕上部朝上垂直为-90度,屏幕上部朝下垂直为90度,屏幕正反水平均为0度。
横滚角:取值为-π到π。屏幕向左翻滚为负,向右翻滚为正,屏幕朝上为0度,屏幕朝下为180度(-180度)。
SensorManager sensorManager= (SensorManager) getSystemService(SENSOR_SERVICE);
Sensor accelerometerSensor = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
Sensor magneticSensor = sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);
final float[] accelerometerReading = new float[3];
final float[] magnetometerReading = new float[3];
class MySensorEventListener implements SensorEventListener {
public void onSensorChanged(SensorEvent event) {
if (event.sensor == accelerometerSensor) {
//加速度传感器数据
// X轴上的加速度
// Y轴上的加速度
// Z轴上的加速度
for (int i=0;i<3;i++){
accelerometerReading[i]=event.values[i];
}
} else if (event.sensor == magneticSensor) {
//磁场传感器数据
// X轴上的磁场强度
// Y轴上的磁场强度
// Z轴上的磁场强度
for (int i=0;i<3;i++){
magnetometerReading[i]=event.values[i];
}
}
//获取旋转矩阵
float[] rotationMatrix = new float[9];
boolean success = SensorManager.getRotationMatrix(rotationMatrix, null, accelerometerReading, magnetometerReading);
if (success) {
//旋转矩阵获取成功
float[] orientationAngles = new float[3];
SensorManager.getOrientation(rotationMatrix, orientationAngles);
//orientationAngles[0]表示方向的角度(方向角),也叫方位(azimuth)。取值为0到2π。
//0度指的是设备的正北方向,90度是正东,180度是正南,270度是正西
//orientationAngles[1]表示俯仰的角度(俯仰角)(pitch),即设备在上下方向上的旋转角度。取值为-π/2到π/2。
//90°表示屏幕朝上垂直,-90表示屏幕朝下垂直
//orientationAngles[2]表示滚动的角度(横滚角)(roll),即设备在左右方向上的旋转角度。取值为-π到π。
//屏幕向左翻滚为负,向右翻滚为正,屏幕朝上为0度,屏幕朝下为180度(-180度)。
// 上下翻转弧度值-π/2到π/2之间
float orientationAngle = orientationAngles[1];
// 转为上下翻度数值-90°到90°之间
float v = (float) Math.toDegrees(orientationAngle);
}
}
public void onAccuracyChanged(Sensor sensor, int i) {
}
}
sensorManager.registerListener(new MySensorEventListener(),accelerometerSensor,SensorManager.SENSOR_DELAY_NORMAL);
sensorManager.registerListener(new MySensorEventListener(),magneticSensor,SensorManager.SENSOR_DELAY_NORMAL);
(2) 陀螺仪
// Sensor.TYPE_GYROSCOPE
SensorEventListener sensorEventListener = new SensorEventListener() {
public void onSensorChanged(SensorEvent event) {
if (event.sensor.getType() == Sensor.TYPE_GYROSCOPE) {
float xAngularSpeed = event.values[0]; // X轴上的角速度
float yAngularSpeed = event.values[1]; // Y轴上的角速度
float zAngularSpeed = event.values[2]; // Z轴上的角速度
// 在这里进行角速度的处理
}
}
public void onAccuracyChanged(Sensor sensor, int accuracy) {
// 精度变化时的处理
}
};
(3) 加速度传感器
// Sensor.TYPE_ACCELEROMETER
SensorEventListener sensorEventListener = new SensorEventListener() {
public void onSensorChanged(SensorEvent event) {
if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
float xAxis = event.values[0]; // X轴上的加速度
float yAxis = event.values[1]; // Y轴上的加速度
float zAxis = event.values[2]; // Z轴上的加速度
// 在这里进行加速度数据的处理
}
}
public void onAccuracyChanged(Sensor sensor, int accuracy) {
// 精度变化时的处理
}
};
(4) 磁场传感器
// Sensor.TYPE_MAGNETIC_FIELD
SensorEventListener sensorEventListener = new SensorEventListener() {
public void onSensorChanged(SensorEvent event) {
if (event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD) {
float xMagneticField = event.values[0]; // X轴上的磁场强度
float yMagneticField = event.values[1]; // Y轴上的磁场强度
float zMagneticField = event.values[2]; // Z轴上的磁场强度
// 在这里进行磁场数据的处理
}
}
public void onAccuracyChanged(Sensor sensor, int accuracy) {
// 精度变化时的处理
}
};
4. 接近传感器
Sensor.TYPE_PROXIMITY
接近传感器检测物体与手机的距离 ,单位是厘米。一些接近传感器只能返回远和近两个状态,因此,接近传感器将大于最大距离返回远状态,小于最大距离返回近状态。
// Sensor.TYPE_PROXIMITY
SensorEventListener sensorEventListener=new SensorEventListener() {
public void onSensorChanged(SensorEvent sensorEvent) {
//传感器数值变化
//物体离屏幕距离
float f=sensorEvent.values[0];
}
public void onAccuracyChanged(Sensor sensor, int i) {
//传感器精度变化
}
};
5. 线性加速度传感器,未校准磁场传感器,未校准陀螺仪
1 - 线性加速度传感器:
Sensor.TYPE_LINEAR_ACCELERATION
线性加速度传感器,简称LA-sensor。线性加速度传感器是加速度传感器减去重力影响获取的数据。单位是 m/s2。
2 - 未校准磁场传感器:
Sensor.TYPE_MAGNETIC_FIELD_UNCALIBRATED
未校准磁场传感器 ,提供原始的、未校准的磁场数据。
3 - 未校准陀螺仪传感器:
Sensor.TYPE_GYROSCOPE_UNCALIBRATED
未校准陀螺仪传感器 ,提供原始的、未校准、补偿的陀螺仪数据,用于后期处理和融合定位数据。
(1) 线性加速度传感器
// Sensor.TYPE_LINEAR_ACCELERATION
SensorEventListener sensorEventListener=new SensorEventListener() {
public void onSensorChanged(SensorEvent sensorEvent) {
//传感器数值变化
//x,y,z轴上的线性加速度
float x=sensorEvent.values[0];
float y=sensorEvent.values[1];
float z=sensorEvent.values[2];
}
public void onAccuracyChanged(Sensor sensor, int i) {
//传感器精度变化
}
};
(2) 未校准磁场传感器
// Sensor.TYPE_MAGNETIC_FIELD_UNCALIBRATED
SensorEventListener sensorEventListener=new SensorEventListener() {
public void onSensorChanged(SensorEvent sensorEvent) {
//传感器数值变化
//x,y,z轴上的未校准磁场
float x=sensorEvent.values[0];
float y=sensorEvent.values[1];
float z=sensorEvent.values[2];
}
public void onAccuracyChanged(Sensor sensor, int i) {
//传感器精度变化
}
};
(3) 未校准陀螺仪传感器
// Sensor.TYPE_GYROSCOPE_UNCALIBRATED
SensorEventListener sensorEventListener=new SensorEventListener() {
public void onSensorChanged(SensorEvent sensorEvent) {
//传感器数值变化
//x,y,z轴上的未校准角速度
float x=sensorEvent.values[0];
float y=sensorEvent.values[1];
float z=sensorEvent.values[2];
}
public void onAccuracyChanged(Sensor sensor, int i) {
//传感器精度变化
}
};
6. 传感器一览
请注意部分传感器需要申请权限!
- TYPE_ACCELEROMETER 加速度,常用于摇一摇功能
- TYPE_MAGNETIC_FIELD 磁场
- TYPE_ORIENTATION 方向,已弃用,取而代之的是getOrientation 方法
- TYPE_GYROSCOPE 陀螺仪,用来感应手机的旋转和倾斜
- TYPE_LIGHT 光线,用来感应手机正面的光线强弱
- TYPE_PRESSURE 压力,用来感应气压
- TYPE_TEMPERATURE 温度,已弃用,取而代之的是类型13
- TYPE_PROXIMITY 距离
- TYPE_GRAVITY 重力
- TYPE_LINEAR_ACCELERATION 线性加速度
- TYPE_ROTATION_VECTOR 旋转矢量
- TYPE_RELATIVE_HUMIDITY 相对湿度
- TYPE_AMBIENT_TEMPERATURE 环境温度
- TYPE_MAGNETIC_FIELD_UNCALIBRATED 未校准磁场
- TYPE_GAME_ROTATION_VECTOR 无标定旋转矢量
- TYPE_GYROSCOPE_UNCALIBRATED 未校准陀螺仪
- TYPE_SIGNIFICANT_MOTION 特殊动作
- TYPE_STEP_DETECTOR 步行检测,用户每走一步就触发一次事件
- TYPE_STEP_COUNTER 步行计数,记录激活后的步伐数
- TYPE_GEOMAGNETIC_ROTATION_VECTOR 地磁旋转矢量
- TYPE_HEART_RATE 心跳速率,可穿戴设备使用,如手环
- TYPE_TILT_DETECTOR 倾斜检测
- TYPE_WAKE_GESTURE 唤醒手势
- TYPE_GLANCE_GESTURE 掠过手势
- TYPE_PICK_UP_GESTURE 拾起手势