Android传感器Sensor

目录

1. 传感器基础步骤

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

(2) 获取传感器Sensor

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

2. 光强传感器

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

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

(2) 陀螺仪

(3) 加速度传感器

(4) 磁场传感器

4. 接近传感器

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

(1) 线性加速度传感器

(2) 未校准磁场传感器

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


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

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

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) {
        //传感器精度变化
    }
};

猜你喜欢

转载自blog.csdn.net/m0_57150356/article/details/134668633