2012-02-20 69 views
3

我必須從我的Android手機收集加速度計數據,所以我已經做了一個小程序來做到這一點。不可能改變加速度計的速度

一些測試後,我發現我的Nexus S的加速度計的速率爲每秒總是 50值當手機處於活動狀態,以及每秒6個值時,它是睡着了(有PARTIAL_WAKE_LOCK),無論速度我要求(NORMAL,UIGAMEFASTEST)。

所以我決定安裝在互聯網上發現了一個應用程序,它測試的加速度計的速度:http://samoht.fr/tuto/accelerometers-frequency-on-android-with-code

但我得到了同樣的「錯誤」:凡是我要求的速度,它始終是每50個值第二次在手機處於活動狀態時。

我不明白爲什麼我的手機的行爲如此。它是一個問題:

  • 有關的Nexus S?
  • 特定於我的手機?
  • 與Android 4相關嗎?

EDIT:我已測試了另一個的Nexus S(的Android 4)的程序,我有同樣的問題。 所以它似乎消除了上面列出的可能性之一:它不僅僅與我的手機有關。

+1

我已經嘗試了華碩變壓器平板電腦上的代碼,我有同樣的問題。所有傳感器延遲使用50赫茲的頻率。我也會尋找答案。 – vgonisanz 2012-02-20 10:02:54

+1

您可以嘗試使用仿真器的各種配置,以確定它是依賴於操作系統還是依賴於設備。我敢打賭,價值取決於你的硬件,不能改變...另外,閱讀此:http://stackoverflow.com/questions/4224223/android-how-to-increase-accelerometer-sampling-rate – 2012-02-28 12:32:19

+0

謝謝,我會嘗試與模擬器! – 2012-02-28 14:37:38

回答

6

我在不同的智能手機上進行了一些測試。下面是結果:

Samsung Galaxy Teos 
------------------- 
* When awake 
    Normal: 4.17 Hz 
    UI: 8.43 hz 
    Game: 16.93 Hz 
    Fastest: 109.42 Hz 

* When asleep 
    The phone sends null values (0), whatever the mode I chose 


Samsung Nexus S 
--------------- 
* When awake 
    Normal: 49.51 Hz 
    UI: 49.51 hz 
    Game: 49.51 Hz 
    Fastest: 49.51 Hz 

* When asleep 
    6.06 Hz, whatever the mode I chose 

LG Nexus 5 
---------- 
* When awake 
    Normal: 15.39 Hz 
    UI: 15.4 Hz 
    Game: 50.05 Hz 
    Fastest: 196.74 Hz 

* When asleep 
    Normal: 4.96 Hz 
    UI: 15.41 Hz 
    Game: 50.12 Hz 
    Fastest: 198.53 Hz 

LG Nexus 4 
---------- 
* When awake 
    Normal: 15.75 Hz 
    UI: 15.74 Hz 
    Game: 48.86 Hz 
    Fastest: 195.85 Hz 

* When asleep 
    Normal: 5.5 Hz 
    UI: 15.74 Hz 
    Game: 49.16 Hz 
    Fastest: 196.75 Hz 


Samsung Galaxy Nexus 
-------------------- 
* When awake 
    Fastest: 125 Hz 

* When asleep 
    It sends data 


Samsung Galaxy Note 2 
--------------------- 
* When awake 
    Fastest: 100 Hz 

* When asleep 
    The phone does not send anything 


Samsung Galaxy S3 and S3 Mini 
----------------------------- 
* When awake 
    Fastest: 100 Hz 

* When asleep 
    Fastest: 100 Hz 


HTC Wildfire 
------------ 
* When awake 
    Normal: 4 Hz 
    UI: 12 hz 
    Game: 22.2 Hz 
    Fastest: 38.40 Hz 

* When asleep 
    The phone does not send anything, whatever the mode I chose 


HTC Desire 
---------- 
* When awake 
    Normal: 4.36 Hz 
    UI: 11.9 hz 
    Game: 23.3 Hz 
    Fastest: 47.27 Hz 

* When asleep 
    The phone does not send anything, whatever the mode I chose 

注意的是,試驗已使用部分喚醒鎖進行。沒有它,Nexus S在睡眠時根本沒有提供任何數據。

也有其加速度計發(或沒有)兼容的數據時睡着了智能手機的一個有用的清單:http://www.saltwebsites.com/2012/android-accelerometers-screen-off

+0

嗨羅曼,你能給我一些關於你如何測試不同手機在不同模式下的速率的指針嗎? – R3D3vil 2012-04-11 23:15:03

+0

嗨Nisarg,我用這個應用程序來測試設備的頻率:http://samoht.fr/tuto/accelerometers-frequency-on-android-with-code 幸運的是,我的公司擁有幾個設備,所以我可以測試我引用的那些在我的答案中。 – 2012-04-12 07:38:30

+0

嗨羅曼,非常感謝...我會嘗試這一個! – R3D3vil 2012-04-12 23:27:40

3

不要通過手機連接到PC USB,因爲在收集數據時,數據僅記錄在SD卡中。當手機通過USB連接到PC時,沒有文件可以保存在SD卡中。

因此,嘗試在收集數據時斷開USB連接。

+0

我已測試過您的應用程序,實際頻率約爲16-17赫茲。 你是怎麼做到的?是通過檢查onSensorChanged()方法中的值嗎?如果是這樣,它不能解決我的問題。 – 2012-03-09 09:46:05

+0

順便說一句,回答我的意見,而不是答案;) – 2012-03-09 09:47:27

+0

我們沒有使用SensorChanged()方法。相反,我們通過代碼獲取最大樣本數(通過使用最快),並且我們通過對應於每秒15個樣本的算法執行了降採樣。希望這也適用於你。 – aps109 2012-03-10 18:08:46

1

不幸的是通過其他的答案,延遲(或採樣率)爲提示你設置是隻然而,對於你的應用程序所要求的最低限度的建議(對於系統),這可以根據運行的其他應用程序或進入省電模式的設備(關閉CPU等)而發生劇烈變化。我能夠獲得較好採樣率的一種方式是通過記錄服務中的數據,使該服務成爲前臺服務並使用PARTIAL_WAKE_LOCK標誌進行電源鎖定。

我把代碼在這個要點 https://gist.github.com/julian-ramos/6ee7ad8a74ee4b442530

這要點有這樣更多的代碼比你需要的只是要注意接下來的兩個方法

@Override 
    public int onStartCommand(Intent intent, int flags, int startId) { 
//  //Power management 
     PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE); 
     wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "My Tag"); 
     wl.acquire(); 
.....} 

上面的代碼防止OS轉關閉CPU

我們使這個服務前臺服務

NotificationCompat.Builder notificationBuilder = 
       new NotificationCompat.Builder(getApplicationContext()) 
         .setContentTitle("Title") 
         .setContentText("hola") 
         .setContentIntent(viewPendingIntent); 



     NotificationManagerCompat notificationManager = NotificationManagerCompat.from(this); 

     not=notificationBuilder.build(); 
     notificationManager.notify(notificationId,not); 
     startForeground(notificationId, not); 

與普通服務不同,上述代碼使服務成爲操作系統的優先級。例如,前臺服務的例子是音樂播放器。

使用此代碼,即使在手錶自動關閉屏幕後,我也能夠獲得所需的採樣率。