基础部分
传感器类型
动作传感器
这类传感器在三个轴(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:
获取系统支持传感器类型
/**
* 支持传感器列表
*
* 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)
参考:
如何获取Android设备所支持的传感器种类