参考文章:Android传感器-运动传感器.本文的例子比较详细。
GalaxyS9+传感器
S9+中使用了多个传感器,包括虹膜传感器、3D传感器、指纹传感器(后置)、加速计、陀螺仪、距离传感器、指南针、气压计、心率传感器和SpO2血氧饱和度。
SpO2血氧饱和度
测定方法原理:将探头指套固定在病人指端,利用手指作为盛装血红蛋白的透明容器,使用波长660 nm的红光和940 nm的近红外光作为射入光源,测定通过组织床的光传导强度,来计算血红蛋白浓度及血氧饱和度。通过SPO2监护,我们可以得到SPO2,脉率,脉搏波。
一般认为SpO2正常应不低于94%,在94%以下为供氧不足。有学者将SpO2<90%定为低氧血症的标准,并认为当SpO2高于70%时准确性可达±2%,SpO2低于70%时则可有误差。临床上我们曾对数例病人的SpO2数值,与动脉血氧饱和度数值进行对照,认为SpO2读数可反映病人的呼吸功能,并在一定程度上反映动脉血氧的变化。
S9中的血氧饱和度测试使用红外光线,收集反射,测量SpO2。
测量方法:打开SamsungHealth界面,在主页上添加心跳测量和血氧饱和度测量。食指轻按背部摄像机右侧的红外相机阵列,点击GalaxyS9+选定的项目测量,开始测量....。
传感器API
在工程中调用传感器API
在android的sensor中想Sensor.TYPE_ROTATION_VECTOR、Sensor.TYPE_GRAVITY、Sensor.TYPE_HEART_RATE等传感器是虚拟出来的,使用的是其他传感器生成的数据,为合成传感器。一些如Sensor.TYPE_HEART_BEAT、Sensor.TYPE_PROXIMITY、Sensor.TYPE_GYROSCOPE为原始传感器,数据为硬件API直接获得的。
获取传感器
private SensorManager sensorManager;
private Sensor proximitySensor;
private SensorEventListener proximitySensorListener;
private Sensor gyroscopeSensor;
private SensorEventListener gyroscopeSensorListener;
private Sensor rotationVectorSensor;
private SensorEventListener rvListener;
private Sensor heartRateSensor;
private SensorEventListener hrListener;
private Sensor heartbeatSensor;
private SensorEventListener hbListener;
其中 gyroscopeSensor 、rotationVectorSensor、heartRateSensor 、heartBeatSensor分别为陀螺仪、角速度传感器、心率传感器、心跳传感器。当然这只是一个名字。
以原始传感器重力传感器-陀螺仪为例, 对传感器的调用在这个初始化过程中
// 获取陀螺仪
gyroscopeSensor = sensorManager.getDefaultSensor(Sensor.TYPE_GYROSCOPE);
此外,需要设置监听器;
// Create a listener
gyroscopeSensorListener = new SensorEventListener() {
@Override
public void onSensorChanged(SensorEvent sensorEvent) {
// More code goes here
if (sensorEvent.values[2] > 0.5f) { // anticlockwise
getWindow().getDecorView().setBackgroundColor(Color.BLUE);
} else if (sensorEvent.values[2] < -0.5f) { // clockwise
getWindow().getDecorView().setBackgroundColor(Color.YELLOW);
}
}
@Override
public void onAccuracyChanged(Sensor sensor, int i) {
}
};
// Register the listener 注册听众
sensorManager.registerListener(gyroscopeSensorListener,
gyroscopeSensor, SensorManager.SENSOR_DELAY_NORMAL);
测试效果:
参考API: https://developer.android.com/guide/topics/sensors/sensors_motion.html
传感器 |
SensorEvent数据 |
描述 |
测量单位 |
TYPE_ACCELEROMETER |
SensorEvent.values[0] |
沿x轴的加速度(包括重力) |
m/s2(平方) |
SensorEvent.values[1] |
沿y轴的加速度(包括重力) |
||
SensorEvent.values[2] |
沿z轴的加速度(包括重力) |
||
TYPE_GRAVITY |
SensorEvent.values[0] |
沿x轴的重力 |
m/s2 |
SensorEvent.values[1] |
沿y轴的重力 |
||
SensorEvent.values[2] |
沿z轴的重力 |
||
TYPE_GYROSCOPE |
SensorEvent.values[0] |
绕x轴旋转的速率 |
rad/s |
SensorEvent.values[1] |
绕y轴旋转的速率 |
||
SensorEvent.values[2] |
绕z轴旋转的速率 |
||
TYPE_GYROSCOPE_UNCALIBRATED |
SensorEvent.values[0] |
绕x轴的旋转速率(无偏移补偿) |
rad/s |
SensorEvent.values[1] |
绕y轴的旋转速率(无偏移补偿) |
||
SensorEvent.values[2] |
绕z轴的旋转速率(无偏移补偿) |
||
SensorEvent.values[3] |
绕x轴的预计偏移 |
||
SensorEvent.values[4] |
绕y轴的预计偏移 |
||
SensorEvent.values[5] |
绕z轴的预计偏移 |
||
TYPE_LINEAR_ACCELERATION |
SensorEvent.values[0] |
沿x轴的加速度(不包括重力) |
m/s2 |
SensorEvent.values[1] |
沿y轴的加速度(不包括重力) |
||
SensorEvent.values[2] |
沿z轴的加速度(不包括重力) |
||
TYPE_ROTATION_VECTOR |
SensorEvent.values[0] |
沿x轴旋转矢量分量(x*sin(θ/2)). |
无单位 |
SensorEvent.values[1] |
沿y轴旋转矢量分量(y*sin(θ/2)). |
||
SensorEvent.values[2] |
沿z轴旋转矢量分量(z*sin(θ/2)). |
||
SensorEvent.values[3] |
旋转向量的标量分量((cos(θ/2)).(标量分量是可选的) |
||
TYPE_SIGNIFICANT_MOTION |
N/A |
N/A |
N/A |
TYPE_STEP_COUNTER |
SensorEvent.values[0] |
从传感器激活那一刻起的步数 |
步数 |
TYPE_STEP_DETECTOR |
N/A |
N/A |
N/A |
旋转矢量传感器和重力传感器是运动检测中使用频率最高的传感器. 旋转矢量传感器是多功能的, 可以广泛的用于运动相关的任务, 比如检测手势, 检测角度改变, 检测相关的方向变化. 在开发游戏的时候经常用到旋转矢量传感器, 还有增强现实的应用, 二维或者三维的罗盘, 或者一个相机稳定的APP. 在大多数的情况下, 使用这些传感器会比用加速度计和磁力计或者方向传感器更好.