Android中的步数计数器:永远在线?

Fab*_*ioC 12 android accelerometer google-fit

一个众所周知的问题是,许多Android手机在屏幕关闭时关闭加速度计.然而Android Fit(应用程序)似乎发生了一些变化.即使屏幕熄灭,Fit也会保持计数步数.如果安装了Fit,则会在Fit环境中引发事件以进行步数计数,并且我可以使用它来捕获它们

Fitness.SensorsApi.findDataSources(mClient, new DataSourcesRequest.Builder()
                .setDataTypes(DataType.TYPE_STEP_COUNT_CUMULATIVE)
Run Code Online (Sandbox Code Playgroud)

我在三星S4和Oneplus One上测试了这个,在这两种情况下都计算了步数.他们是怎么做到的?他们使用什么Android类?我的理解是,自Kitkat以来引入的可用方法是实现SensorEventListener.例如,theelfismike提供了实现此功能的代码.然而,在许多手机上,当屏幕熄灭时,步数会停止.有趣的是,如果安装了Google Fit应用程序,计数似乎并没有停止(因此我猜他们会保持加速度计开启).

我错过了什么吗?屏幕关闭后保持计数步骤的功能是否可供凡人程序员使用?谢谢!

sim*_*dam 8

正如Ilja所说,即使屏幕关闭,您的代码也会运行.但在这种情况下,我想我们需要一个不同的答案.

他们肯定使用一个保留唤醒锁的服务,并向传感器查询数据.这里的重要部分是拿着唤醒锁 - 你必须防止设备在服务的整个生命周期内进入睡眠状态 - 如果你不想错过一些数据.

但是这种方法会很快耗尽电池电量,因为为了检测步骤,您需要处理来自传感器的大量数据.

这就是为什么有传感器批处理.这样,即使不保持设备唤醒,也可以获得连续的传感器数据.它基本上将传感器事件存储在芯片本身的基于hw的队列中,并且仅以预定间隔批量发送到您的应用程序(服务,...).这使您可以在不显着耗尽电池的情况下进行全天候监控.请注意,只有受支持的芯片组可以做到这一点(您可以在Android文档中找到详细信息),如果是旧手机,您需要回退到可怕的唤醒锁定方法以获取数据.

您也可以使用Google Fit API,但只有在设备上安装了Google Fit + Google Play服务时才会启用监控功能.

  • @JohanShogun:文档内容:网络访问被禁用,除非您的应用程序收到高优先级的 Google Cloud Messaging 请求。唤醒锁被忽略。使用 AlarmManager 类计划的警报将被禁用,但使用 setAlarmClock() 方法和 AlarmManager.setAndAllowWhileIdle() 设置的警报除外。不允许运行同步适配器和 JobScheduler 的同步和作业。结论:您在打瞌睡时将无法获取加速度计数据 - 您可能会在稍后获得它们(或某些部分),具体取决于硬件队列大小(一旦打瞌睡)。 (2认同)