“自定义”传感器事件发生率似乎不SensorManager.registerListener(SensorEventListener监听器,传感器传感器,诠释率)

问题描述:

更新到工作:

我能解决我被引入一类具有特定问题-scope静态计数器,并忽略任何x个事件。但我仍然想知道我在做什么错误:在微秒内向提示器注册一个提示,而不是使用四个给定常量中的一个。“自定义”传感器事件发生率似乎不SensorManager.registerListener(SensorEventListener监听器,传感器传感器,诠释率)


在我的应用程序中的活动是使传感器获取设备的方向,确定滚动并使用它。

我使用

SensorManager.registerListener(SensorEventListener listener, Sensor sensor, int rate)

注册我的传感器。从Android Documentation for this method:

参数

[...]

速度传感器事件在交付。这只是对系统的暗示。事件可能比指定速率更快或更慢。通常事件收到更快。该值必须是SENSOR_DELAY_NORMAL,SENSOR_DELAY_UI,SENSOR_DELAY_GAME或SENSOR_DELAY_FASTEST之一,或者所需的事件之间的延迟(以微秒为单位)。

如果我使用4个预定义的常量之一,那么应用程序工作正常;但是,这些常量都会提供速度提示,这些提示太快而无法满足我的需求。我必须发送一个UDP数据包,其中包含每个事件更改的一些信息,并且接收端似乎正在使用任何预定义的速率完全淹没消息。使用像30000这样的整数(因为API以毫秒为单位指定数量)会导致应用程序停止一起报告传感器事件。

我错过了什么使我无法使用我自己的事件速率提示?

+0

是的,我也想这样做!我能想到的唯一解决方案是手动过滤数据包。 – David 2011-07-08 16:03:09

+2

这是一个徒劳的目标(基于直接经验),因为传感器驱动程序没有义务服从您的提示。事实上,它可以以任何/所有预定义的常数以相同的速率发送事件!你最好的选择是在你达到你想要的时间三角洲时积累和触发。 – 2011-10-19 11:05:32

我很确定传感器监听器的速度做了它应该做的事情。在你的问题中,你写了30000,这是30毫秒。在文档中,它表示速度通常比提示更快。所以你的速度超过了30ms。您的其他网络相关例程是否可能太快?它可能导致了一些阻塞,导致您认为传感器报告已停止。

在我的应用程序中,我也发现给定的NORMAL速率太高。因此,我将速率设置为250000.我还使用移动平均值计算将数字平滑5次。我发现生成的行为接近iPhone指南针。

尽管如此,我并不建议您在传感器侦听器中进行网络报告。这不应该这样做。但是,您可以在侦听器中进行一些简单的计算并记录该值。然后,使用诸如Handler.postDelayed之类的高定时器来处理网络发送等。

+0

自从我看过这个项目已经很长时间了(这是我在5月底离职的一份工作),但我记得当时我尝试了大量不同的值,包括面积约600毫米,仍然没有结果。此外,在将信息封装到数据报并发送出去之前,我正在检查设备端的事件,因此网络应该与此无关。网络报告也没有在听众中完成。数据被打包并发送到处理网络的AsyncTask。 – 2011-10-21 15:56:07

+0

@DougStephen有什么理由让你失望?我答案的哪一部分是不正确的? – 2012-03-27 00:44:15

+1

我没有投票给你。其他人可能做到了。 – 2012-03-27 03:01:42

这个问题在2011年被问到,不过从那时起就有很多改变了;从API 19(2013+)开始,有一个注册API的新变种,您可以在其中提及您希望以何种间隔接收传感器读数。从该文档:

布尔registerListener(SensorEventListener听者, 传感器传感器, INT samplingPeriodUs, INT maxReportLatencyUs)注册一个SensorEventListener用于在给定的取样频率 给定的传感器和所述给定的最大报告延迟。

该函数与registerListener(SensorEventListener, Sensor,int)类似,但它允许事件在传递之前临时保留在硬件 FIFO(队列)中。这些事件可以存储在硬件FIFO中的 maxReportLatencyUs微秒。一旦需要报告FIFO中的一个 事件,将按顺序报告FIFO 中的所有事件。这意味着某些事件将在最大报告延迟时间到达之前报告为 。