2015-04-24 105 views
4

我正在同步我的應用程序時間與android.location.Location的方法getTime()onLocationChanged方法調用。問題是,在某些設備上,結果是正確的,速度提高了約15秒。據我所知,這是因爲GPS time and UTC differenceAndroid GPS時間快15秒

如何檢查設備知道這種差異?我需要在所有設備上同時顯示我的應用。

我無法使用網絡同步作爲解決方案。

+0

哪些API速度快15秒? –

+0

@ yaa110手機快15秒,標籤有正確的時間,他們都是19 API。 – Ircover

+0

'快15秒'O__O這對我來說是新的 – Gattsu

回答

4

根據docs

衆長的getTime()

Return the UTC time of this fix, in milliseconds since January 1, 
1970. 

Note that the UTC time on a device is not monotonic: it can jump 
forwards or backwards unpredictably. So always use 
getElapsedRealtimeNanos() when calculating time deltas. 

On the other hand, getTime() is useful for presenting a human readable 
time to the user, or for carefully comparing location fixes across 
reboot or across devices. 

All locations generated by the LocationManager are guaranteed to have 
a valid UTC time, however remember that the system time may have 
changed since the location was generated. 

返回

time of fix, in milliseconds since January 1, 1970. 

你嘗試getElapsedRealtimeNanos()?

要將其轉換爲日期,use

Date date = new Date(System.currentTimeMillis() 
        - SystemClock.elapsedRealtime() 
        + location.getElapsedRealtimeNanos()); 
+1

它在17 API中添加,而我需要從14開始支持API。 – Ircover

+0

規範,如您所示,規定getTime應返回UTC時間。有些設備在返回GPS時間時違反了這個規範,這個時間與UTC時間的偏差是UTC時間增加的閏秒數。 – Michael

3

可能有一對夫婦在這裏打球不同的因素。

GPS & UTC

首先是,正如你所指出的GPS時間是UTC不同。 GPS有一條消息,宣傳UTC的當前偏移量,請參見here。有可能並非手機中的所有GPS芯片都會關注它,或者在您要求獲取GPS時間數據時尚未收到GPS偏移消息。

除非在Android API中支持發現這種情況,否則您將被減少爲自己解釋NMEA語句(我不知道Android是否可以使用它們),即使如此,它也將取決於製造商已決定放入這些句子。

根據this PDF,完整的年曆數據可能需要半個小時才能被GPS接收器接收。年曆包含當前的GPS/UTC偏移量。我的猜測是,因爲移動GPS芯片是圍繞AGPS(輔助GPS)構建的,所以他們可能期望獲得來自蜂窩網絡的GPS年曆數據,並且在保留或接收年曆時可能不太聰明數據爲他們自己。

所以,如果你超出了WiFi和移動電話網絡的範圍(你說你不能使用網絡同步來獲取一天中的時間......),可能需要從手機的GPS的12.5分鐘到半小時之前芯片開始給你UTC時間而不是GPS時間。

這是一個漫長的時間移動的GPS芯片打開。我猜測他們經常沒有通過操作系統啓動足夠長的時間來接收整個年曆。

如果這確實是你的問題的原因,那麼你可能會被擊沉。 GPS曆書數據不會經常改變AFAIK,所以你可以自己緩存它,並以某種方式將它提供給操作系統/ GPS,以便從本地單元基站讀取它。儘管這聽起來很低級,但我懷疑Android是否支持這種年曆注入(這對於惡意軟件來說是一個可怕的拒絕服務機會......)。

時鐘偏移

另一個不太可能的因素是,手機不一定運行在相同的方式桌面可以NTP客戶端。大多數Linux桌面發行版都會安裝一個NTP客戶端,該客戶端可以在後臺不斷運行,使本地時鐘與某個NTP服務器保持同步。移動設備(包括AFAIK Android)通常不需要那麼高的時間精度,所以他們很少爲了節省電池壽命而糾正自己的時鐘,所以有可能產生大量的漂移。不過,如果它不到15秒,我會感到驚訝,所以它可能不是由於這個原因。