2010-12-11 50 views
6

我的應用使用LocationListener來跟蹤當前位置。只要GPS提供商提供定期修復,這很好。不過,我希望我的應用能夠提醒用戶,如果位置不再可靠,因爲修復不再是最新的。因此,我使用timeCheckHandler每隔幾秒鐘調用一次getLastKnownLocation。Android問題找出最近的最新GPS定位是多少

我的問題是,即使頻繁接收到準確的修復,通過將getTime()返回給getLastKnownLocation返回的位置返回的時間通常比System.currentTimeMillis()返回的當前時間還要早20秒。

我已經通過將代碼添加到onLocationChanged(arg0)來記錄修復時間(arg0.getTime())和當前時間(System.currentTimeMillis())來進一步調查問題。我再次看到約20秒的差異。

代碼當前如下:

public void onLocationChanged(Location arg0) { 
    mapview.handleLocationChanged(mapview, arg0.getLatitude(), arg0.getLongitude(), arg0.getBearing(), arg0.getAccuracy(), "GPS fix"); 
    addDebugNote("Fix received at time: "+Long.toString(arg0.getTime()/1000)+" Now: "+Long.toString((System.currentTimeMillis())/1000)); 
} 

和典型輸出到我的調試文件讀取:

Fix received at time: 1292091908 Now: 1292091928 

爲什麼我應該看到修復的時間與當前系統時間之間的差異?

我必須接受約20秒的差異是否正常嗎?

+0

我有同樣的問題,我補充說:'arg0.setTime(System。currentTimeMillis());'作爲'onLocationChanged(Location arg0)'方法的第一行來「糾正」時間戳。我不確定這是否會在後面產生任何副作用 – ApollonDigital 2015-04-08 16:19:13

回答

20

GPS定位時間獨立於您的網絡提供商時間/設備時間。 System.currentTimeMillis()會給你設備上的設備時間。

如果你想知道的一點是如何最近您可以:

  1. 同步這兩個時間(GPS和設備)在你的代碼在應用程序啓動的,只要你走在兩者之間的區別第一次GPS位置更新。在即時查詢設備時間,看看兩者有什麼不同。將這種差異保存在變量中。

  2. 將此用作後續位置更新中的校正因子,以根據您所需的參考座標系知道確切時間。 (設備時間或GPS)

另外我發現使用NETWORK作爲位置提供者,您可能只會獲得設備時間。因此,如果您正在聆聽來自GPS和網絡的更新,您可能還需要使用location_obj.getProvider()區分這一點,並過濾掉GPS提供商。

+1

謝謝。這非常有幫助。 (我想GPS時間必須非常精確,以便它能夠以這樣的精度工作。我想知道爲什麼電話網絡根本就不會與它同步) – prepbgg 2010-12-19 17:54:47

+0

好點,也許它更可能是網絡比GPS更有可能?無論哪種方式,如果你的手機同步GPS時間我們不會遇到一個網絡時間,當我們試圖getTime()時關閉?所以基本上當我們使用網絡進行位置更新時,我們不得不使用計時器 – 2012-12-03 15:37:14

1

今天重複測試我發現GPS時間和系統時間之間的差異是22秒。這個問題在網絡上的其他地方討論過,似乎GPS時間和手機的系統時間之間存在差異是正常的(在我的情況下,設置爲從網絡自動更新)。一個因素是GPS從UTC時間開始,時間約爲15或17秒(取決於哪一個來源是正確的)......它不同步,因爲自1980年以來GPS時間沒有被更新爲定期的「閏秒」。

考慮到這一點,我認爲我需要檢查當前最新修復程序的答案是將當前系統時間與最新修復程序的系統時間(不是GPS時間)進行比較。

+0

重新閱讀位置的Android參考我提醒說,getTime()返回修復的UTC時間,並且我認爲我可以依賴這是準確的。因此,它必定是電話的系統時間不準確。在互聯網上進一步閱讀,我發現通常情況下電話的時鐘會漂移幾秒鐘。 – prepbgg 2010-12-13 08:45:36