此問題可能稍微冗長,但對於很多建議都是開放的。用於在多個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()
的。我真的很喜歡他的代碼/答案,但是這個「服務器」是什麼和/或我如何設置它,如果這是最好的解決方案?
我們實際上正在和我們的服務器進行通信 - 我將會看看其中一個人是否會編寫一個API函數,從服務器獲取時間,然後我們可以通過Android設備進行通信。感謝代碼 - 非常有幫助。如果這項工作/不成功,我會盡快回復您。 – Mxyk
感謝您的幫助 - 我們決定使用DatagramSockets在類似的WiFi網絡上主持/接收時間,以便所有手機都能同步到主持手機的時間。如果我有任何DatagramSocket問題,我一定會問。 – Mxyk
@Mxyk您是否準確地將移動設備上的時間同步到了? – flux