2010-12-11 21 views
6

Uygulamam geçerli konumu takip etmek için LocationListener kullanır. GPS Sağlayıcısı düzenli düzeltmeler sağladığı sürece, bu iyi çalışır. Ancak, düzeltmenin artık geçerli olmadığı için konumun artık güvenilir olmadığı durumlarda uygulamanızı uyarmasını istiyorum. Bu nedenle, her birkaç saniyede bir getLastKnownLocation çağırmak için bir timeCheckHandler kullandım.Android sorunu ne zaman son GPS düzeltmesi olduğunu bulma

Sorunum, doğru düzeltmeler alındığında bile, getTime() öğesini getLastKnownLocation tarafından döndürülen konuma uygulayarak döndürülen zaman genellikle System.currentTimeMillis() tarafından döndürülen saatten genellikle daha eskidir, genellikle yaklaşık 20 saniye sürer .

Düzeltme süresini (arg0.getTime()) ve geçerli saati (System.currentTimeMillis()) günlüğe kaydetmek için onLocationChanged (arg0) öğesine kod ekleyerek sorunu daha fazla araştırdım. Yine yaklaşık 20 saniye fark görüyorum.

aşağıdaki gibi Kod şu anda okur: Benim ayıklama dosyasına

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)); 
} 

ve tipik çıkış okur:

Fix received at time: 1292091908 Now: 1292091928 

Neden düzeltme süresi ve mevcut sistemin zaman arasındaki bu farkı görmem gerektiğini ?

Yaklaşık 20 saniye farkın normal olduğunu kabul etmek zorunda mıyım?

+0

Aynı sorunu yaşadım ve ekledim: 'arg0.setTime (System.currentTimeMillis()); 'timeLocationChanged (Location arg0)' ilk satırında zaman damgasını "düzeltmek" yöntemidir. Bunun herhangi bir yan etki yaratıp yaratmayacağından emin değilim. – ApollonDigital

cevap

20

GPS konumu, şebeke sağlayıcınızın zaman/cihaz zamanından bağımsız olarak gelir. System.currentTimeMillis() cihazınızda cihaz saatini ayarlamanızı sağlar. Eğer nokta ne kadar yeni bilmek istiyorsanız

şunları yapabilirsiniz:

  1. Senkronize hem kısa sürede olsun her ikisi arasındaki farkı alarak uygulama başlangıcında kodunuzda kez (GPS ve cihaz) ilk GPS konum güncellemesi. Bu anlık sorgulama cihazında zaman ve her ikisinde ne fark olduğunu gör. Bu farkı değişkene kaydedin.

  2. Gereksinim duyduğunuz referans çerçevesine göre tam zamanı bilmek için bunu sonraki konum güncellemelerinde düzeltme faktörü olarak kullanın. (Cihaz zamanı veya GPS)

Ayrıca, NETWORK'u konum sağlayıcı olarak kullanmanın yalnızca cihaz zamanını alabileceğini bulmuştum. Bu nedenle (GPS ve ağ) güncellemelerini dinliyorsanız, bunu location_obj.getProvider() kullanarak ayırt etmeniz ve GPS sağlayıcısını filtrelemeniz gerekebilir.

+1

Teşekkürler. Bu çok yardımcı. (GPS saatinin bu kadar hassas bir şekilde çalışabilmesi için çok doğru olması gerektiğini düşünüyorum. Telefon ağlarının neden onunla senkronize edilmediğini merak ediyorum.) – prepbgg

+0

iyi bir nokta, belki de ağın gps'den daha yüksek olması ihtimali nedir? her iki şekilde de, eğer telefonunuzun saati gps ile eşzamanlıyorsa, getTime() 'ı denediğimizde kapalı olan bir ağ saati ile karşılaşmadık mı? Bu nedenle, konum güncellemeleri için ağ kullandığımızda temel olarak zamanlayıcılar kullanmalıydık –

1

Testi tekrar etmek Bugün GPS süresi ile Sistem saati arasındaki farkın 22 saniye olduğunu buldum. Bu konu web üzerinde başka bir yerde tartışılıyor ve GPS zamanı ile telefonun sistem zamanı arasında bir fark olması normal gibi görünüyor (ki bu durum benim durumumda ağdan otomatik olarak güncellenmeye ayarlanıyor.) Bir faktör de GPS saat UTC zamanından itibaren 15 veya 17 saniyedir (hangi kaynağın doğru olduğuna bağlı olarak) ... senkronizasyon dışıdır çünkü GPS zamanı, 1980'den beri düzenli aralıklarla “atlama saniye” olarak güncellenmemiştir.

Bunu akılda tutarak, en son düzeltmenin sistem saatiyle (GPS zamanı değil) mevcut sistem saatini karşılaştırmak için ne kadar güncel olduğunu kontrol etme ihtiyacımın cevabını düşünüyorum.

+0

Konum için Android referansını yeniden okuyorum getTime() öğesinin düzeltmenin UTC zamanını döndürdüğünü hatırlıyorum ve bunun doğru olduğuna güvenebileceğimi varsayıyorum. Bu nedenle telefonun yanlış olduğu sistem zamanı olmalıdır. İnternette daha fazla okumak, telefonların saatlerinin senkronizasyondan kaç saniye sürdüğünü görüyorum. – prepbgg

İlgili konular