# 传感器

提示

  • 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);
最后更新: 2022/9/12 16:01:28