需求-Android开发计步器调研与选型参考
Posted LQS_Android
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了需求-Android开发计步器调研与选型参考相关的知识,希望对你有一定的参考价值。
计步器原理调研
计步方式背景知识
1.加速度传感器Sensor.TYPE_ACCELEROMETER计步方式:
这种方式是有开源的算法根据加速度传感器进行计算步数;
优点:只要有加速度传感器的设备都可以使用,相对来说可以使用的设备较多。
缺点:步数的准确性取决于算法且算法比较难优化;需要后台保活Service否则不能计步;计步算法比较费电;部分手机锁屏不能计步;
2.计步传感器Sensor.TYPE_STEP_COUNTER计步方式:
源码如下:
public static final int TYPE_STEP_COUNTER = 19;
关于这个计步传感器常量的源码注释、翻译如下
A constant describing a step counter sensor.
A sensor of this type returns the number of steps taken by the user since the last reboot while activated. The value is returned as a float (with the fractional part set to zero) and is reset to zero only on a system reboot. The timestamp of the event is set to the time when the last step for that event was taken. This sensor is implemented in hardware and is expected to be low power. If you want to continuously track the number of steps over a long period of time, do NOT unregister for this sensor, so that it keeps counting steps in the background even when the AP is in suspend mode and report the aggregate count when the AP is awake. Application needs to stay registered for this sensor because step counter does not count steps if it is not activated. This sensor is ideal for fitness tracking applications.
It is defined as an {@link Sensor#REPORTING_MODE_ON_CHANGE} sensor.
This sensor requires permission {@code android.permission.ACTIVITY_RECOGNITION}.
See {@link android.hardware.SensorEvent#values SensorEvent.values} for more details.
翻译:
描述步进计数器传感器的常数。
这种类型的传感器返回用户自上次重启以来所采取的步骤数。该值作为浮点数返回(小数点部分设置为零),并且只在系统重新启动时重置为零。事件的时间戳被设置为采取该事件的最后一步的时间。该传感器采用硬件实现,预计功耗较低。如果您想在很长一段时间内连续跟踪步数,请不要注销该传感器,以便它在后台继续计数步数,即使AP处于挂起模式,并在AP被唤醒时报告总计数。应用程序需要对此传感器保持注册状态,因为如果未激活步长计数器,它将不计算步长。这种传感器是理想的健身跟踪应用。
它被定义为一个{@link Sensor#REPORTING_MODE_ON_CHANGE}传感器。
优点:硬件计步准确性高;功耗小;只要注册不用后台Service自动计步;
缺点:Android4.4系统以上的部分手机;手机系统重启计步器清零;不能返回步数明细(步数对应时间),只是返回当前时间的总步数。
计步模块设计思路
计步模块两种计步方式都采用:
①判断是否支持Sensor.TYPE_STEP_COUNTER如果支持采用计步传感器,如果不支持用加速度传感器计步。
②使用加速度传感器计步需要用户自己手动设置后台自启动,否则不能计步。
③使用计步传感器需要在程序中克服他的缺点:手机系统重启计步器清零;不能返回步数明细(步数对应时间),只是返回当前时间的总步数。
先介绍接入方法,在介绍计步模块原理。
CSDN技术文章:
安卓计步器是如何实现计步的:
https://blog.csdn.net/yunxiu988622/article/details/104898651/
开源库-星数最多
https://github.com/linglongxin24/DylanStepCount
参考开源库一:
GitHub链接
https://github.com/jiahongfei/TodayStepCounter
参考开源库二:
GitHub链接
https://github.com/AndroidyxChen/TodaySteps
上面两个GitHub网址中的demo实现步骤:开源库一是参考开源库二并在其基础上优化实现而来。
下面是开源库一的开发思路:
https://www.jianshu.com/p/cfc2a200e46d
https://www.sohu.com/a/198701946_611601
GitHub链接https://github.com/jiahongfei/TodayStepCounter
计步模块流程图:
讲解流程图:
1.整个计步模块是由一个运行在单独进程的Service(TodayStepService)来提供,由于运行在单独的进程所以对外提供的接口采用aidl形式(ISportStepInterface)。
2.零点分隔广播(TodayStepAlertReceive):用来解决跨天计步模块归零问题,由于计步传感器不会根据天来分割只是返回当前步数的总和,所以需要这个广播来对计步模块进行分割,只要跨天了计步模块就归零从0开始计步。
3.开机广播(TodayStepBootCompleteReceiver):开机广播用来解决手机重启计步传感器归零问题,由于计步传感器手机重启会归零,所以收到开机广播会做步数合并,启动Service从上次关机的步数开始累加。
4.数据库(TodayStepDBHelper):用来记录当天步数明细,一个时间对应一个步数。
5.加速度传感器计步(TodayStepDetector):由于android4.4以下或者一些特殊的手机不提供计步传感器所以这些机型采用加速度传感器进行计步,通过OnStepCounterListener监听返回给TodayStepService .
6.计步传感器计步(TodayStepCounter):android4.4以上提供了计步协处理器,可以通过计步传感器计步功耗小,计步准,通过OnStepCounterListener监听返回给TodayStepService .
7.关机监听(TodayStepShutdownReceiver):用来判断手机是否关机,当重启手机打开计步Service根据这个标志来判断是否重启进行步数合并,主要是增加精度有时开机广播不能收到。
加速度传感器计步流程图
讲解流程图:
Android4.4以下或者一些特殊的手机不提供计步传感器,我只能用加速度传感器计步,加速度传感器的原理就是利用一定的算法模拟出步数(加速度传感器计步算法不在本篇文章讨论的范围之内),用这种方式计步Service一定要在后台存活否则不能计步,这种方式跨天分隔步数利用Intent.ACTION_TIME_TICK广播回调来判断当前时间和上次PreferencesHelper记录的时间是否相同如果不同步数归零从0开始计步,步数的记录采用PreferencesHelper来保存,防止当天重启手机系统步数归零。
计步传感器计步流程图
讲解流程图:
Android4.4以上的可以使用计步传感器进行计步,至于计步传感器的有点上面已经介绍了。这种方式部分手机可以不需要程序自启动权限。
跨天分隔步数采用两种方式:
1.第一种方式和上面一样采用Intent.ACTION_TIME_TICK广播,这里不多说了。
2.第二种方式采用AlertManager方式也就是设置0点闹钟,在这个0点广播中对步数进行分隔,这个AlertManager不是每个手机都可以启动的。
手机系统重启判断采用四种方式:
1.开机广播监听BOOT_COMPLETED,这个监听不是每个手机都可以收到,如果收到可以启动Service,然后做步数合并使计步模块从上次关机时的步数开始累加,如果收不到只能用下面几种方式增加重启的判断了。
2.关机广播监听ACTION_SHUTDOWN,这个监听不是每个手机都可以收到,如果收到,在用户手动启动 Service中可以判断系统重启了。
3.记录运行时间判断手机重启,上次运行的时间大于当前运行时间判断为重启,只是增加精度,极端情况下连续重启,会判断不出来。
4.上次传感器步数总和,当前传感器步数小于上次传感器步数肯定是重新启动了,只是用来增加精度不是绝对的
计步传感器计步核心流程:
提高计步精度:
1.设置app后台自启动
2.各种安全软件设置app为白名单,为了保证app不被任何安全软件在后台杀死。
以上两种方式保证通知栏中一直显示app的步数。
3.手机系统重启,如果通知栏中没有显示步数,表示app没有收到开机监听,需要手动启动app,否则步数会丢失 。
app一直在后台存活肯定会耗电,部分手机可以在后台关闭的情况下计步,但是这种方式需要每天早上打开一次app让计步模块对步数进行清零否则步数会丢失。
需要优化:
1.每次传感器回调都会写三次SharedPreferences。
2.计步模块在后台存活,每天过0点开始计步都会丢失一些步数,丢失的步数跟启动计步传感器需要的步数有关,例如:我的测试机连续走10步才可以启动计步传感器回调,所以就丢失10步。
总结:
Android计步就是在和android系统作斗争,各种系统监听回调都不好用(AlertManager、BOOT_COMPLETED、JobScheduler),还要解决计步传感器的一些限制(系统重启清零,不能自动分天,部分手机进程杀死不能计步),还要规避不同手机的问题,我们只能尽量做到不丢失步数,提高计步精度,目前我在测试计步发现支付宝计步非常准,我猜测系统为支付宝做了系统进程。
缺点:APP被杀死后过零点需要重启APP,第二天才可以计步,否则无法计步!!
Android 后台运行白名单,优雅实现保活:
https://juejin.cn/post/6844904023955341319
运行GitHub上demo实例时,Notification通知报错:
2021-05-14 12:13:54.467 13508-13508/com.jsmcc E/CrashReport: android.app.RemoteServiceException: Bad notification for startForeground
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2184)
at android.os.Handler.dispatchMessage(Handler.java:107)
at android.os.Looper.loop(Looper.java:230)
at android.app.ActivityThread.main(ActivityThread.java:7866)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:526)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1034)
2021-05-14 12:13:54.467 13508-13508/com.jsmcc E/CrashReport: #++++++++++++++++++++++++++++++++++++++++++#
解决方案:
在8.0以前,安卓的通知是没有进行分类的,用过的童鞋都被深深的折磨。为了进一步优化管理通知,Google在发布android 8 时对通知做了修改优化,出现了通知渠道功能。通过渠道ID对通知进行了分类。
在Android 8.0中使用Notification中发生 Bad notification for startForeground错误
https://www.jianshu.com/p/8baa62c5bfc2
囧言:(可以发给你们老板和产品经理看看:)
入行计步需谨慎,一着不慎毁终身!!!
以上是关于需求-Android开发计步器调研与选型参考的主要内容,如果未能解决你的问题,请参考以下文章