最近做健康相关的项目,需要实现计步和睡眠的统计。本文主要记录计步功能实现过程和问题以及部分问题解决方案。计步处理主要有2种方式:一种取第三方的计步数据(例如小米运动,三星健康,华为运动健康等);一种是取手机自带的传感器,注册监听器,统计和计算步数。第一种方式见(三方步数数据传递图),计步数据准确性在匹配的系统上都很准(小米运动对应小米手机,华为对应华为手机),毕竟亲生的。本文主要记录第二种实现和bug修复。
一、功能实现
android系统中,所有传感器都是通过SensorManager获取的,要获取计步传感器和加速度传感器可以使用以下代码
//获取传感器管理者
SensorManager sm = (SensorManager) this.getSystemService(Context.SENSOR_SERVICE);
//获取计步传感器,步数能累加
Sensor counter = sm.getDefaultSensor(Sensor.TYPE_STEP_COUNTER);
//获取加速度传感器,步数不能累加
Sensor detector = sm.getDefaultSensor(Sensor.TYPE_STEP_DETECTOR);
//传感器变化监听器
SensorEventListener sensorEventListener = new SensorEventListener() {
@Override
public void onSensorChanged(SensorEvent event) {
//传感器变化后回调的参数封装的对象,values数组存储传感器变化后的数据
//计步传感器 count是上次开机到当前记录的总的震动数 例如 星期一开机 到星期四 总共走了5万步,此时回调就会是 count = 50000.0 float count = event.values[0];
//加速度传感器 detector 表示单次震动,一般值是1.0 ,但不能说明就是完成一次步行,还要取出 values[1] values[2]进行模型计算,具体算法可以网上查询也可以看我github上传的demo
float detector = event.values[0];
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) { }
};
//第三个参数表示,监听器回调频率
sm.registerListener(sensorEventListener,counter,SENSOR_DELAY_FASTEST);
从回调结果我们发现加速度传感器只能统计单次,十分依赖后台保活运行。而计步传感器通过记录差值计算步数,而不依赖程序保活。一般android5.0以上手机都会附带计步传感器,在低版本或者低配手机上则使用使用加速度计步。
二、开发问题及解决方案
1)计步传感器 回调步数某些机型上会回落,导致bug --------> 计算差值时提高变动判断 只有上次缓存步数 - 回调步数小于100才算传感器被清零;检测开机广播,主动清零缓存步数。
2}计步传感器 跨天步数计算-----------> 增加保活机制;不保活时间段步数,如果跨天记录到前一天;设置零点闹钟进行分割(效果不好)
3)小米MIUI 和华为EMUI系统管理电池,导致在熄屏状态下传感器数据变动无法检测(app回调事件只能拿到熄屏时的回调数据) ------->引导用户设置 电池管理和应用优化白名单
4)某些手机计步传感器会出现拿不到回调,手机重启后恢复正常 --------->应该是手机传感器问题,暂提醒用户重启