安卓 传感器基础

非淡泊无以明志,非宁静无以致远。这篇文章主要讲述安卓 传感器基础相关的知识,希望能为你提供帮助。
基础部分 传感器类型动作传感器
这类传感器在三个轴(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通过系统服务获取: SensorManagermSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE); s2、获取我们需要的传感器类型: //单次有效计步 SensormStepCount = mSensorManager.getDefaultSensor(Sensor.TYPE_STEP_COUNTER); //系统计步累加值 SensormStepDetector = 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-关于传感器你需要知道的

    推荐阅读