Android传感器Sensor

目录

1. 传感器基础步骤

(1) 获取传感器管理者 SensorManager

(2) 获取传感器Sensor

(3) 判断传感器是否为空,并注册监听

2. 光强传感器

3. 加速度传感器,磁场传感器,陀螺仪

(1) 加速度传感器与磁场传感器配合计算翻转角度与方向

(2) 陀螺仪

(3) 加速度传感器

(4) 磁场传感器

4. 接近传感器

5. 线性加速度传感器,未校准磁场传感器,未校准陀螺仪

(1) 线性加速度传感器

(2) 未校准磁场传感器

(3) 未校准陀螺仪传感器

6. 传感器一览


因为有许多传感器已经被手机生产商摒弃,所以我写了这篇文章未记录还常见的可用传感器。

光强、加速度、磁场、陀螺仪、接近、线性加速度、未校准磁场、未校准陀螺仪。

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. 传感器一览

请注意部分传感器需要申请权限!

  1. TYPE_ACCELEROMETER  加速度,常用于摇一摇功能
  2. TYPE_MAGNETIC_FIELD  磁场
  3. TYPE_ORIENTATION 方向,已弃用,取而代之的是getOrientation 方法
  4. TYPE_GYROSCOPE  陀螺仪,用来感应手机的旋转和倾斜
  5. TYPE_LIGHT 光线,用来感应手机正面的光线强弱
  6. TYPE_PRESSURE  压力,用来感应气压
  7. TYPE_TEMPERATURE 温度,已弃用,取而代之的是类型13
  8. TYPE_PROXIMITY 距离
  9. TYPE_GRAVITY 重力
  10. TYPE_LINEAR_ACCELERATION 线性加速度
  11. TYPE_ROTATION_VECTOR 旋转矢量
  12. TYPE_RELATIVE_HUMIDITY 相对湿度
  13. TYPE_AMBIENT_TEMPERATURE 环境温度
  14. TYPE_MAGNETIC_FIELD_UNCALIBRATED 未校准磁场
  15. TYPE_GAME_ROTATION_VECTOR 无标定旋转矢量
  16. TYPE_GYROSCOPE_UNCALIBRATED 未校准陀螺仪
  17. TYPE_SIGNIFICANT_MOTION 特殊动作
  18. TYPE_STEP_DETECTOR 步行检测,用户每走一步就触发一次事件
  19. TYPE_STEP_COUNTER 步行计数,记录激活后的步伐数
  20. TYPE_GEOMAGNETIC_ROTATION_VECTOR 地磁旋转矢量
  21. TYPE_HEART_RATE 心跳速率,可穿戴设备使用,如手环
  22. TYPE_TILT_DETECTOR 倾斜检测
  23. TYPE_WAKE_GESTURE 唤醒手势
  24. TYPE_GLANCE_GESTURE 掠过手势
  25. TYPE_PICK_UP_GESTURE 拾起手势
  • 22
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

在下嗷呜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值