2011-05-03 100 views
6

更新到工作:

我能解決我被引入一類具有特定問題-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

回答

0

我很確定傳感器監聽器的速度做了它應該做的事情。在你的問題中,你寫了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

0

這個問題在2011年被問到,不過從那時起就有很多改變了;從API 19(2013+)開始,有一個註冊API的新變種,您可以在其中提及您希望以何種間隔接收傳感器讀數。從該文檔:

布爾registerListener(SensorEventListener聽者, 傳感器傳感器, INT samplingPeriodUs, INT maxReportLatencyUs)註冊一個SensorEventListener用於在給定的取樣頻率 給定的傳感器和所述給定的最大報告延遲。

該函數與registerListener(SensorEventListener, Sensor,int)類似,但它允許事件在傳遞之前臨時保留在硬件 FIFO(隊列)中。這些事件可以存儲在硬件FIFO中的 maxReportLatencyUs微秒。一旦需要報告FIFO中的一個 事件,將按順序報告FIFO 中的所有事件。這意味着某些事件將在最大報告延遲時間到達之前報告爲 。