2012-06-25 67 views
7

此問題可能稍微冗長,但對於很多建議都是開放的。用於在多個Android設備上錄製數據的同步時間


問題陳述:
我們有幾個API級別8(Android 2.2的),我們將使用在遊樂園記錄加速度數據,即坐在過山車上的myTouch設備。我們還有一個可視化功能,使我們可以根據它們記錄的時間函數繪製和查看加速度計點。這裏是我們兩難的地方! Android設備上的系統時間不完全相同,它們也不能以毫秒精度設置爲同一時間(只能以微小精度手動執行,這很糟糕)。


解決方案嘗試:
所以,我根據在應用的開始找到GPS第一時間使出記錄數據。處理時間短:獲得GPS時間,獲得系統時間,獲得差異,並在記錄數據點時,再次獲取系統時間並將差值重新添加到時間上,標記爲記錄的開始時間,並且爲每個時間增加200毫秒從那裏記錄數據點。但是,有2個問題(獲取GPS時間):

  • 使用getLastKnownLocation()不太準確。其實,這看起來很不準確。它給我的時間比現在的格林尼治標準時間/世界標準時間還要9分鐘。巧合的是,Android設備上的系統時間也接近9分鐘... GPS時間和系統時間之間的差異通常在1000到5000毫秒(1到5秒)之間。我想有一個機會我的代碼是錯誤的。我粘貼在下面讓你看。

  • requestSingleUpdate()會很好用,因爲它會得到一個更近的位置,也許是一個非常準確的時間。問題?需要API級別9 ...我們沒有的設備。


思路:
這裏有一個想法,我有,但 - 如果我以某種方式從網站拉一個全球性的時間和使用從那裏拉作爲記錄的時間的時間?這裏的問題 - 我不知道該怎麼做,這只是我的一廂情願...

另一個想法 - 是否有某種全球性的getTime() - 我根本不知道的功能類型?


推理爲什麼我要Android的從一個類似時鐘拉時間:
試想兩個人坐在過山車 - 一個在前座,一個在後面。在記錄數據時,前面的人顯然會在後面的人面前略微體驗加速度(我們希望在我們的可視化圖上看到這一點)。這就是爲什麼精確到毫秒,這些點是根據單一的全球時間來記錄的。


代碼:

Criteria c = new Criteria(); 
c.setAccuracy(Criteria.ACCURACY_FINE); 

if (mLocationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) { 
    mLocationManager.requestLocationUpdates(mLocationManager.getBestProvider(c, true), 0, 0, AmusementPark.this); 
    Criteria criteria = new Criteria(); 
    String bestProvider = mLocationManager.getBestProvider(criteria, false); 
    Location location = mLocationManager.getLastKnownLocation(bestProvider); 

    try { 

     gpsTime = location.getTime(); 
     systemTime = System.currentTimeMillis(); 
     timeDif = gpsTime - systemTime; 
     Log.e("timedif", "GPS: " + gpsTime + ", System: " + systemTime +", Dif: " + timeDif); 

    } catch (NullPointerException e){ 

    } 

} 

更新:
Here,有人建議一種 「服務器」 getTime()的。我真的很喜歡他的代碼/答案,但是這個「服務器」是什麼和/或我如何設置它,如果這是最好的解決方案?

回答

2

我認爲響應者在這篇文章中提到的「服務器」是設置一個專用的時間服務器。基本上你會設置一些硬件,所有的人使用你的應用程序將連接到,以獲得時間。這可能是更多的努力比你願意把英寸

你會需要滿足以下條件,

  1. 一些備用的硬件(可能爲計算機運行Tomcat一樣簡單,或作爲複雜專用服務器機架,具體取決於您認爲將使用您的應用的人數)或訂購域服務器/ Web主機。

  2. 某些Web服務只是在應用程序請求它時返回時間。

  3. 你需要讓你的服務器/ web服務公開,這是一個令人頭痛的問題。

我不確定這將是您的最佳解決方案,因爲它將取決於網絡連接到達您的專用服務器。有幾種替代解決方案可供您嘗試:

我不知道您的應用是否會公開或專門用於研究。如果是後者,它將與一組您認識並可以協調的人員合作,我建議您只需下載ClockSync,將手機同步到同一時間服務器,然後執行您的應用程序。

如果你的應用程序將被分發給你不會接觸的人,那麼最好的辦法就是讓你的應用程序與一個ntp服務器建立連接,並抓住時間。這裏是公共NTP服務器的列表,你可以使用:http://www.pool.ntp.org/en/

這裏的一些信息:

ClockSync

Sample code用於製造SNTP連接

我希望這些信息可以利用來你在做決定。

+0

我們實際上正在和我們的服務器進行通信 - 我將會看看其中一個人是否會編寫一個API函數,從服務器獲取時間,然後我們可以通過Android設備進行通信。感謝代碼 - 非常有幫助。如果這項工作/不成功,我會盡快回復您。 – Mxyk

+1

感謝您的幫助 - 我們決定使用DatagramSockets在類似的WiFi網絡上主持/接收時間,以便所有手機都能同步到主持手機的時間。如果我有任何DatagramSocket問題,我一定會問。 – Mxyk

+0

@Mxyk您是否準確地將移動設備上的時間同步到了? – flux

相關問題