Android的传感器大多都跟手机的硬件有关,有些传感器还跟手机的软件与硬件都相关。
很多人很迷茫,什么叫传感器呀?其实传感器就是一系列手机内部自带的测量仪器。可以用来测量方向、距离、磁力、光线等等(包括你知道的和你很多不知道的)。
想要拿到手机上的传感器管理器(SensorManager),还是需要通过Activity.getSystemService(@ServiceName @NonNull String name)
。
// 获取传感器管理器
SensorManager sensorManager = (SensorManager) this.getSystemService(Context.SENSOR_SERVICE);
// 获得全部的传感器列表
List<Sensor> sensors = sensorManager.getSensorList(Sensor.TYPE_ALL);
这里介绍主流的11种Sensor。
Type | Name | Value |
---|---|---|
TYPE_ACCELEROMETER | 加速度传感器 | 1 |
TYPE_MAGNETIC_FIELD | 磁力传感器 | 2 |
TYPE_ORIENTATION | 方向传感器 | 3 |
TYPE_GYROSCOPE | 陀螺仪传感器 | 4 |
TYPE_LIGHT | 光线感应传感器 | 5 |
TYPE_PRESSURE | 压力传感器 | 6 |
TYPE_TEMPERATURE | 温度传感器 | 7 |
TYPE_PROXIMITY | 距离传感器 | 8 |
TYPE_GRAVITY | 重力传感器 | 9 |
TYPE_LINEAR_ACCELERATION | 线性加速度传感器 | 10 |
TYPE_ROTATION_VECTOR | 旋转矢量传感器 | 11 |
最大取值范围
Sensor.getMaximumRange()
设备名称
Sensor.getName()
功率
Sensor.getPower()
精度
Sensor.getResolution()
传感器类型
Sensor.getType()
设备供应商
Sensor.getVentor()
设备版本号
Sensor.getVersion()
根据传感器的Type获取该Type默认配置的传感器
SensorManager。getDefaultSensor(int type)
以监听加速度传感器为例,可以拿到传感器测量的数据。
// 获取默认加速度传感器
Sensor accelerometer = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
/** * 传感器监听 * SensorEvent.values[0] = x * SensorEvent.values[1] = y * SensorEvent.values[2] = z */
SensorEventListener listener = new SensorEventListener() {
@Override
public void onSensorChanged(SensorEvent event) {
String info = "";
for (int i = 0; i < event.values.length; i++) {
info += "event.values[" + i + "]:" + event.values[i] + "\t";
}
Log.i("SensorManagerActivity", info);
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}
};
// 给对应传感器添加监听
sensorManager.registerListener(listener, accelerometer, SensorManager.SENSOR_DELAY_NORMAL);
x、y、z的值分别表示在x、y、z轴上的加速度。
这三个数值是都到地心引力的影响,单位是m/s^2。
手机平放,x轴默认为0,y轴默认0,z轴默认9.8。
x、y、z的值分别表示在x、y、z轴上的环境磁场数据。
单位是微特斯拉(micro-Tesla),用uT表示。
同时也能换算成高斯(Gauss),1Tesla=10000Gauss。
x、y、z的值分别表示在x、y、z轴上的角度数据。
单位是角度。
x、y、z的值详细的角度数据对应为:azimuth、pitch、roll。
azimuth:方位,返回水平时磁北极和Y轴的夹角,范围为0°~360°。
0°=北,90°=东,180°=南,270°=西。
pitch:x轴和水平面的夹角,范围为-180°~180°。
当z轴向y轴转动时,角度为正值。
roll:y轴和水平面的夹角,范围为-90°~90°。
当x轴向z轴移动时,角度为正值。
x、y、z的值分别表示在x、y、z轴上的角加速度数据。
单位是radians/second。
x值表示检测到的实时光线强度, 范围在0~未知(我的手机上最大可以到46000)
单位是lux,是照射到单位面积上的光通量。
光线感应传感器主要用于Android系统的LCD自动亮度功能。
可以根据采样到的光强数值实时调整LCD的亮度。
返回当前的压强(目前我的手机上没有这个传感器 –Moto X Style)。
单位是百帕斯卡hectopascal(hPa)。
返回当前的温度。(目前我的手机上没有这个传感器 –Moto X Style)。
x的值返回物体与手机屏幕的距离。范围为0~100。
单位是厘米。
可用于接听电话时自动关闭LCD屏幕以节省电量。
一些芯片集成了接近传感器和光线传感器两者功能。
z值返回重力数据。
地球上,重力数值为9.8,单位是m/s^2。
手机平放,显示的数据和加速度传感器显示的数据一样。
线性加速度传感器是加速度传感器减去重力影响获取的数据。
单位是m/s^2。
线性加速度 = 加速度 - 重力
手机平放时,重力数据又和加速数据一样。所以此时,线性加速度的默认数据为:x=0,y=0,z=0。
这个太复杂了!建议不要去玩这个了。
旋转矢量代表设备的方向,是一个将坐标轴和角度混合计算得到的数据。
RV-sensor输出三个数据:
value[0] = x*sin(theta/2)
value[1] = y*sin(theta/2)
value[2] = z*sin(theta/2)
sin(theta/2)是RV的数量级。
RV的方向与轴旋转的方向相同。
RV的三个数值,与cos(theta/2)组成一个四元组。