Android加速度计传感器监听器频率意外变化

标签 android listener accelerometer android-sensors sensormanager

我有一个为加速度计、陀螺仪和磁力计调用 sensorManager.registerListener() 的应用程序,它为处理程序注册所有传感器,并且每个传感器都设置为 SENSOR_DELAY_NORMAL。这在绝大多数时间都没有问题。

但是,在查看一些日志时,我注意到加速度计的频率似乎随机变化,从大约 179 毫秒(这似乎是我手机上的平均 SENSOR_DELAY_NORMAL)到大约 20 毫秒。

经过大量的挖掘和测试,我发现原因是手机快速摇动。当发生这种情况时,所有其他传感器将保持其约 179 毫秒的速率,但只有加速度计会将其速率增加到约 20 毫秒。一段时间后,速率最终会从 ~20ms 下降到 ~179ms 的设定速率。

我不确定它需要多长时间才能恢复到 ~179 毫秒的速率,我已经尝试卸载并重新安装该应用程序,如果还没有足够的时间,加速度计仍将在 ~20 毫秒时触发事件。

我想看看我是否可以解决这个问题,但在发生这种情况时以正确的速率取消注册和重新注册监听器,但是无论我将其重置为什么,加速度计都将继续以约 20 毫秒的速度运行。我确实发现我可以取消注册加速度计监听器,这似乎有效,但它并没有解决我的问题。

有人知道为什么加速度计监听器会改变它的发射速率,我该如何解决这个问题?

最佳答案

您请求 Android 的延迟只是建议的延迟。 Android系统和其他应用程序可以改变这一点。 Source

发生这种情况的原因很简单——

  • 设备上可用的物理传感器数量有限,1 个加速度计、1 个磁力计、1 个陀螺仪
  • 比如您的应用程序,每 100 毫秒从加速度计注册所有事件。
  • 另一个应用程序,每 10 毫秒从加速度计请求所有事件
  • 现在由于只有一个传感器并且有 2 种不同的需求,Android 使加速度计能够以所有应用发出的所有延迟请求中最低的延迟提供数据,然后 Android 仅以该延迟频率报告所有事件。<
  • 在这种情况下,应用程序开发人员可以在事件超出要求时忽略这些事件。

关于Android加速度计传感器监听器频率意外变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32058135/

相关文章:

屏幕关闭时Android加速度计不起作用

android - Azure AD Graph API - 在 iOS/Android 上获取 token

javascript - 控制回调的 "this"上下文

java - Spring Batch - 了解 block 大小和 ItemReadListener 之间的行为

algorithm - 使用传感器融合的运动跟踪

ios - Swift Accelerometer 与 ScrollView 不断崩溃

android - RecyclerView具有Section Header的项目(任意位置的元素动态更新)

java - 如何在listView中初始化项目总数和某些价格的总值(value)?

android - flutter NoSuchMethodError : The getter 'debugDidSendFirstFrameEvent' was called on null

javascript - 监听 Cookie,设置后刷新页面 - Javascript