Android传感器Sensor

目录

1. 传感器基础步骤

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

(2) 获取传感器Sensor

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

2. 光强传感器

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

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

(2) 陀螺仪

(3) 加速度传感器

(4) 磁场传感器

扫描二维码关注公众号,回复: 17363409 查看本文章

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