# 传感器
提示
- SENSOR_DELAY_FASTEST : 快速获取传感器信息,延迟较小
- SENSOR_DELAY_GAME : 适合游戏的频率
- SENSOR_DELAY_NORMAL : 正常频率
- SENSOR_DELAY_UI : 适用于普通用户界面的频率,延迟较大
# 坐标系
当一个设备被放在其默认的方向上时(竖屏)
- X 轴是水平指向右的
- Y 轴是垂直向上的
- Z 轴是指向屏幕正面之外,即屏幕背面是 Z 的负值
# 磁场传感器
磁场传感器一般用来分辨方向(东南西北)、识别金属物品等
//获取传感器管理器
SensorManager MagneticFieldSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
//传感器种类:磁场传感器
Sensor MagneticFieldSensor = MagneticFieldSensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);
//设置监听事件
MagneticFieldSensorManager.registerListener(MagneticFieldListener, MagneticFieldSensor, SensorManager.SENSOR_DELAY_NORMAL);
//磁场传感器监听事件
private SensorEventListener MagneticFieldListener = new SensorEventListener() {
@Override
//传感器的值发生变化时调用
public void onSensorChanged(SensorEvent event) {
Log.i("磁场传感器:\n" + "X轴磁场强度:"+ event.values[0] + " Y轴磁场强度:" + event.values[1] + " Z轴磁场强度:" + event.values[2]);
}
@Override
//传感器的精度发生变化时调用
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}
};
# 光线传感器
光线传感器一般用来获取光度
//获取传感器管理器
SensorManager LightSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
//传感器种类:亮度传感器
Sensor LightSensor = LightSensorManager.getDefaultSensor(Sensor.TYPE_LIGHT);
//设置监听事件
LightSensorManager.registerListener(LightListener, LightSensor, SensorManager.SENSOR_DELAY_NORMAL);
//亮度传感器监听事件
private SensorEventListener LightListener = new SensorEventListener() {
@Override
//传感器的值发生变化时调用
public void onSensorChanged(SensorEvent event) {
Log.i("当前亮度:" + event.values[0]);
}
@Override
//传感器的精度发生变化时调用
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}
};
提示
`event.values[0]` 返回的是光线强度值, 单位是勒克斯
# 加速度传感器
//获取传感器管理器
SensorManager AccelerometerSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
//传感器种类:加速度传感器
Sensor AccelerometerSensor = AccelerometerSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
//设置监听事件
AccelerometerSensorManager.registerListener(AccelerometerListener, AccelerometerSensor, SensorManager.SENSOR_DELAY_NORMAL);
//加速度传感器监听事件
private SensorEventListener AccelerometerListener = new SensorEventListener() {
@Override
//传感器的值发生变化时调用
public void onSensorChanged(SensorEvent event) {
Log.i("加速度传感器:" + "X:" + event.values[0] + "Y:" + event.values[1] + "Z:" + event.values[2]);
if (event.values[0] > 15 || event.values[1] > 15 || event.values[2] > 20) {
Log.i("手机摇动啦")
}
}
@Override
//传感器的精度发生变化时调用
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}
};
# 方向传感器
方向传感器一般用来感应手机的摆放状态
提示
`getDefaultSensor(Sensor. TYPE_ORIENTATION)` 方法已过期,需要加速度传感器、磁场传感器组合来获得方向传感器
//获取传感器管理器
SensorManager DirectionSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
//设置监听事件
DirectionSensorManager.registerListener(DirectionListener, DirectionSensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD), SensorManager.SENSOR_DELAY_NORMAL);
DirectionSensorManager.registerListener(DirectionListener, DirectionSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), SensorManager.SENSOR_DELAY_NORMAL);
//方向传感器监听事件
private SensorEventListener DirectionListener = new SensorEventListener() {
float[] AccelerometerValue = new float[3];
float[] MagneticFieldValue = new float[3];
@Override
//传感器的值发生变化时调用
public void onSensorChanged(SensorEvent event) {
if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER){
//获取加速度传感器数据
AccelerometerValue = event.values.clone();
}else if (event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD){
//获取磁场传感器数据
MagneticFieldValue = event.values.clone();
}
//保存旋转数据
float[] R = new float[9];
//保存方向数据
float[] values = new float[3];
//获取一个包含旋转矩阵的R数组
SensorManager.getRotationMatrix(R,null,AccelerometerValue,MagneticFieldValue);
//获取方向值
SensorManager.getOrientation(R,values);
//X轴旋转角度
float xangle = (float) Math.toDegrees(values[1]);
//Y轴旋转角度
float yangle = (float) Math.toDegrees(values[2]);
//Z轴旋转角度
float zangle = (float) Math.toDegrees(values[0]);
Log.i("X轴:" + xangle + "Y轴:" + yangle + "Z轴:" + zangle);
}
@Override
//传感器的精度发生变化时调用
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}
};
提示
第 1 个值:手机在水平平面上旋转(水平旋转) 第 2 个值:手机顶部或尾部旋转的角度(竖直旋转) 第 3 个值:手机左侧或右侧旋转的角度(垂直旋转)
# 距离传感器
距离传感器一般用来判断物品是否掉落等,距离传感器取值范围: `[0, 5]` cm
// 获取传感器管理器
SensorManager mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
// 传感器种类:距离传感器
mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY);
mSensorManager.registerListener(new SensorEventListener() {
@Override
//传感器的值发生变化时调用
public void onSensorChanged(SensorEvent event) {
textview.setText("当前距离:" + event.values[0]);
}
@Override
//传感器的精度发生变化时调用
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}
}, mSensor, SensorManager.SENSOR_DELAY_NORMAL);
← Android 笔记 界面布局 →