手机计步功能开发所遇到的问题

最近做健康相关的项目,需要实现计步和睡眠的统计。本文主要记录计步功能实现过程和问题以及部分问题解决方案。计步处理主要有2种方式:一种取第三方的计步数据(例如小米运动,三星健康,华为运动健康等);一种是取手机自带的传感器,注册监听器,统计和计算步数。第一种方式见(三方步数数据传递图),计步数据准确性在匹配的系统上都很准(小米运动对应小米手机,华为对应华为手机),毕竟亲生的。本文主要记录第二种实现和bug修复。

手机计步功能开发所遇到的问题_第1张图片
三方步数数据传递图

一、功能实现

手机计步功能开发所遇到的问题_第2张图片
功能实现图

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)某些手机计步传感器会出现拿不到回调,手机重启后恢复正常 --------->应该是手机传感器问题,暂提醒用户重启

你可能感兴趣的:(手机计步功能开发所遇到的问题)