安卓 传感器基础

时间:2024-03-07 21:27:27

基础部分

传感器类型

动作传感器

这类传感器在三个轴(X、Y、Z)上测量加速度和旋转角度。包括如下几个传感器。

加速(accelerometer)传感器

陀螺仪(gyroscope)传感器

重力(gravity)传感器

线性加速(linear acceleration)传感器

旋转向量(rotational vector)传感器

环境传感器

这类传感器可以测量不同环境的参数,例如周围环境的空气温度和压强、光照强度和湿度。包括如下几个传感器。

温度(barometer)传感器

光线(photometer)传感器

温度(thermometer)传感器

压力(pressure)传感器

位置传感器

这类传感器可以测量设备的物理位置。包括如下几个传感器。

方向(orientation)传感器(数据来自加速传感器和磁场传感器)

磁场(magnetomenter)传感器

 

安卓传感器类型

TYPE_ACCELEROMETER         //加速度传感器(硬件)

TYPE_MAGNETIC_FIELD        //磁场传感器(硬件)

TYPE_ORIENTATION           //方向传感器(软件传感器,数据来自重力和磁场传感器)

TYPE_GYROSCOPE             //陀螺仪传感器(硬件)

TYPE_LIGHT                 //光线传感器(硬件)

TYPE_PRESSURE              //压力传感器(硬件)

TYPE_PROXIMITY             //临近传感器(硬件)

TYPE_GRAVITY               //重场传感器(硬件或软件)

TYPE_LINEAR_ACCELERATION   //线性加速度传感器(硬件或软件)

TYPE_ROTATION_VECTOR       //旋转矢量传感器(硬件或软件)

TYPE_RELATIVE_HUMIDITY     //湿度传感器(硬件)

TYPE_AMBIENT_TEMPERATURE   //温度传感器(硬件)

TYPE_TEMPERATURE           //温度传感器(硬件),从Android4.0开始被TYPE_AMBIENT_TEMPERATURE取代

 

 

安卓传感器参数

传感器回调频率

参数

延迟时间

SensorManager.SENSOR_DELAY_FASTEST

0ms

SensorManager.SENSOR_DELAY_GAME

20ms

SensorManager.SENSOR_DELAY_UI

60ms

SensorManager.SENSOR_DELAY_NORMAL

200ms

 

传感器返回值@link

加速度感应检测——Accelerometer

Accelerometer Sensor测量的是所有施加在设备上的力所产生的加速度的负值(包括重力加速度)。加速度所使用的单位是m/sec^2,数值是加速度的负值。

SensorEvent.values[0]:加速度在X轴的负值

SensorEvent.values[1]:加速度在Y轴的负值

SensorEvent.values[2]:加速度在Z轴的负值

例如:

当手机Z轴朝上平放在桌面上,并且从左到右推动手机,此时X轴上的加速度是正数。

当手机Z轴朝上静止放在桌面上,此时Z轴的加速度是+9.81m/sec^2。

当手机从空中*落体,此时加速度是0

当手机向上以Am/sec^2的加速度向空中抛出,此时加速度是A+9.81m/sec^2

 

重力加速度感应检测——Gravity

重力加速度,其单位是m/sec^2,其坐标系与Accelerometer使用的一致。当手机静止时,gravity的值和Accelerometer的值是一致的。

 

线性加速度感应检测——Linear-Acceleration

Accelerometer、Gravity和Linear-Acceleration三者的关系如下公式:

 

accelerometer = gravity + linear-acceleration

 

地磁场感应检测——Magnetic-field

地磁场的单位是micro-Tesla(uT),检测的是X、Y、Z轴上的绝对地磁场。

 

陀螺仪感应检测——Gyroscope

陀螺仪的单位是弧度/秒,测量的是物体分别围绕X,Y,Z轴旋转的角速度。它的坐标系与加速度传感器的坐标系相同。逆时针方向旋转的角度正的。也就是说,如果设备逆时针旋转,观察者向X,Y,Z轴的正方向看去,就报告设备是正转的。请注意,这是标准的正旋转的数学定义。

 

光线感应检测——Light

values[0]:表示环境光照的水平,单位是SI lux。

 

位置逼近感应检测——Proximity

values[0]:逼近的距离,单位是厘米(cm)。有一些传感器只能支持近和远两种状态,这种情况下,传感器必须报告它在远状态下的maximum_range值和在近状态下的小值。

 

旋转矢量感应检测——Rotation Vector

旋转向量是用来表示设备的方向,它是由角度和轴组成,就是设备围绕x,y,z轴之一旋转θ角度。旋转向量的三个要素是,这样旋转向量的大小等于sin(θ/2),旋转向量的方向等于旋转轴的方向。

values[0]: x*sin(θ/2)

values[1]: y*sin(θ/2)

values[2]: z*sin(θ/2)

values[3]: cos(θ/2) (optional: only if value.length = 4)

 

方向感应检测——Orientation

其单位是角度

values[0]: Azimuth(方位),地磁北方向与y轴的角度,围绕z轴旋转(0到359)。0=North, 90=East, 180=South, 270=West

values[1]: Pitch(俯仰),围绕X轴旋转(-180 to 180), 当Z轴向Y轴运动时是正值

values[2]: Roll(滚),围绕Y轴旋转(-90 to 90),当X轴向Z轴运动时是正值

 

API:

获取系统支持传感器类型
    /**
     * 支持传感器列表
     *  http://blog.csdn.net/redoq/article/details/52515123
     *  https://zhidao.baidu.com/question/2205380242168742428.html
     *  http://www.jianshu.com/p/4c141d851346
     */
    private void testSupportSensorList(){
        SensorManager sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
        String sensorStr = "";
        List<Sensor> list = sensorManager.getSensorList(Sensor.TYPE_ALL);
        for (Sensor sensor:list){
            sensorStr += sensor.getName() + "\n";
        }
        XLog.i(sensorStr);
        sensorStr = "";
        for (Sensor sensor:list){
            switch (sensor.getType()){
                case Sensor.TYPE_ACCELEROMETER:
                    sensorStr += "加速度传感器" + "\n";
                    break;
                case Sensor.TYPE_MAGNETIC_FIELD:
                    sensorStr += "磁场传感器" + "\n";
                    break;
                case Sensor.TYPE_ORIENTATION:
                    sensorStr += "方向传感器" + "\n";
                    break;
                case Sensor.TYPE_GYROSCOPE:
                    sensorStr += "陀螺仪传感器" + "\n";
                    break;
                case Sensor.TYPE_LIGHT:
                    sensorStr += "光线传感器" + "\n";
                    break;
                case Sensor.TYPE_PRESSURE:
                    sensorStr += "压力传感器" + "\n";
                    break;
                case Sensor.TYPE_PROXIMITY:
                    sensorStr += "临近传感器" + "\n";
                    break;
                case Sensor.TYPE_GRAVITY:
                    sensorStr += "重场传感器" + "\n";
                    break;
                case Sensor.TYPE_LINEAR_ACCELERATION:
                    sensorStr += "线性加速度传感器" + "\n";
                    break;
                case Sensor.TYPE_ROTATION_VECTOR:
                    sensorStr += "旋转矢量传感器" + "\n";
                case Sensor.TYPE_RELATIVE_HUMIDITY:
                    sensorStr += "湿度传感器" + "\n";
                    break;
                case Sensor.TYPE_AMBIENT_TEMPERATURE:
                    sensorStr += "温度传感器" + "\n";
                    break;
                case Sensor.TYPE_TEMPERATURE:
                    sensorStr += "温度传感器" + "\n";
                    break;
            }
        }
        XLog.i(sensorStr);
}
传感器使用步骤(通用)
s1、使用传感器之前首先获取SensorManager通过系统服务获取:
SensorManager  mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);

s2、获取我们需要的传感器类型:
//单次有效计步
Sensor  mStepCount = mSensorManager.getDefaultSensor(Sensor.TYPE_STEP_COUNTER);
//系统计步累加值
Sensor  mStepDetector = mSensorManager.getDefaultSensor(Sensor.TYPE_STEP_DETECTOR);

s3、注册监听者(监听传感器事件)
mSensorManager.registerListener(this, mStepDetector, SensorManager.SENSOR_DELAY_FASTEST);
mSensorManager.registerListener(this, mStepCount, SensorManager.SENSOR_DELAY_FASTEST);

PS:取消注册:
mSensorManager.unregisterListener(this, mStepDetector);
mSensorManager.unregisterListener(this, mStepCount);

s4、实现SensorEventListener接口,重写方法并获取数据
@Override
public void onSensorChanged(SensorEvent event) 

参考:

     http://blog.csdn.net/mad1989/article/details/20848181

     如何获取Android设备所支持的传感器种类

     android 判断支持哪些传感器

     Android-关于传感器你需要知道的