Android计步
前言
计步越来越成为人们的强需求,一般有手环计步,手表计步,手机计步等实现,这篇文章讨论下手机上实现计步的两种方案。
加速度传感器(gsensor)
人在走路时,加速度传感器会形成一个类似正弦波形图,因此可以根据检测波峰波谷记步。见下图:
可以分为几步进行:
- 特征选取,由于手机在不同放置条件下三轴传感器会有不同的数据表现,所以 可以取三轴的平方和。
- 滤波,由于得到的数据存在一定的噪音,我们需要过滤掉这些噪音得到比 较平滑的数据,一般有中值滤波和低通滤波。
- 计步监测,我们一般采用判断峰谷值来决定是否是一次计步。
- 动态阈值,采用判断峰谷值来记步需要动态的计算阈值,符合阈值标准才能算一次计步。
- 步数矫正,人的步伐速度在200-2000ms之间,通过记录记步的时间戳,矫正步数。步伐间隔<200ms和>2000ms,认为是无效步数。200ms和>
使用gsensor来计步可能会存在以下问题:
- 续航问题,由于要不停的监测gsensor变化和计算,就会导致手机不会进入休眠状态,一直保持CPU的唤醒,这对于手机的续航可能会带来一定的影响。
- 精度问题,计步算法需要不断的产品迭代,并且要有较好的步数矫正机制,短时间内不能做到优秀的计步功能。
- 后台service保活问题,要保证后台可以实时统计步数需要后台服务一直运行,包括低内存防杀机制、自启机制等。
- 对于一些锁屏自动关闭sensor的定制系统来说不可用。
计步传感器(step-sensor)
相对于使用加速度传感器获取数据和计算实现计步的方式,通过计步传感器sensor监测或者读取计步数对于终端的续航能力有了很大的提高。
在Android4.4(KITKAT)系统API提供了两种硬件计步传感器的支持,因为是硬件所以需要厂商支持。可以通过以下方式查看你的手机是否支持
adb shell pm list features
如果有以下两项说明支持12feature:android.hardware.sensor.stepcounterfeature:android.hardware.sensor.stepdetector代码检测Android4.4后更高并且有sensor支持
1234567891011private boolean isKitkatWithStepSensor() {// BEGIN_INCLUDE(iskitkatsensor)// Require at least Android KitKatint currentApiVersion = android.os.Build.VERSION.SDK_INT;// Check that the device supports the step counter and detector sensorsPackageManager packageManager = getActivity().getPackageManager();return currentApiVersion >= android.os.Build.VERSION_CODES.KITKAT&& packageManager.hasSystemFeature(PackageManager.FEATURE_SENSOR_STEP_COUNTER)&& packageManager.hasSystemFeature(PackageManager.FEATURE_SENSOR_STEP_DETECTOR);// END_INCLUDE(iskitkatsensor)}
在使用前需要声明权限
|
|
TYPE_STEP_COUNTER
API的解释说返回从开机被激活后统计的步数,当重启手机后该数据归零,该传感器是一个硬件传感器所以它是低功耗的。为了能持续的计步,请不要反注册事件,就算手机处于休眠状态它依然会计步。当激活的时候依然会上报步数。该sensor适合在长时间的计步需求。TYPE_STEP_DETECTOR
翻译过来就是走路检测,API文档也确实是这样说的,该sensor只用来监监测走步,每次返回数字1.0。如果需要长事件的计步请使用TYPE_STEP_COUNTER。
用法比较简单,实现比较方便,由于我们需要长时间的计步,所以一般我们采用TYPE_STEP_COUNTER
。
优点:
- 精度相对来说精确。
- 低功耗,对手机续航基本没有影响。
- 不需要后台服务持续唤醒,所以不需要后台保活。
- 实现简单。
缺点:
- 手机必须要Android4.4及以上版本,并且内置计步sensor硬件
- 并不像iOS的M7协处理器记录每天各个时段的计步数据,step counter sensor记录从开机以来所有的步数,每日计步数需要自己维护。
总结
总结来说,如果用g-sensor来实现计步会保证良好的兼容性,排除锁屏自动关闭sensor的定制系统除外,基本所有的Android手机都可以使用,但是需要一定时间的算法调试和后台保活机制的健全保证,开发周期较长;如果项目需求开发周期较短,并且没有强制性的全机型兼容,那么可以考虑使用step-sensor,优点比较明显,而且使用协处理器代替纯软件计算实现计步监测已经是大势所趋。另外以上两种方案都需要开机自启权限。
参考
如何在手机上实现高精度及自适应多种场景的计步器算法
Android-Developers-Samples-BatchStepSensor
利用3轴数字加速度计实现功能全面的计步器设计
本文链接: http://w4lle.com/2016/06/26/step-counter/
版权声明:本文为 w4lle 原创文章,可以随意转载,但必须在明确位置注明出处!
本文链接: http://w4lle.com/2016/06/26/step-counter/