2012-06-07 87 views
2

我在我的應用程序中使用了以下代碼(從教程等),以便從GPS獲得最佳位置修復(或者,如果GPS不在網絡中),然後將其顯示在文本字段中。Android請求位置更新不穩定

crit = new Criteria(); 
context = Context.LOCATION_SERVICE; 
locationManager = (LocationManager) this.getSystemService(context); 
crit.setAccuracy(Criteria.ACCURACY_FINE); 
crit.setPowerRequirement(Criteria.POWER_LOW); 
crit.setAltitudeRequired(false); 
crit.setBearingRequired(false); 
crit.setSpeedRequired(false); 
crit.setCostAllowed(false); 
try { 
    bestProvider = locationManager.getBestProvider(crit, true); 
    loc = locationManager.getLastKnownLocation(bestProvider); 
    locationManager.requestLocationUpdates(bestProvider, 0, 0, 
      new GeoUpdateHandler()); 
} catch (java.lang.RuntimeException run) { 
    Toast.makeText(getBaseContext(), 
    "Waiting for location fix...", Toast.LENGTH_SHORT).show(); 
} 

我的問題是在位置之間移動。我開始在諾福克使用我的應用程序,並確定位置。第二天,我在康沃爾郡(距離100英里),當我切換我的應用程序(它應該已被Android關閉/銷燬)時,它仍然顯示我諾福克的位置。我發現,如果我然後退出我的應用程序並重新啓動它,它會提取新的位置。我可以輕鬆做到這一點,但我的用戶覺得這是一個真正的痛苦。

我的假設是,如果GPS /網絡可用,那麼我啓動應用程序,組委會從最後已知位置創建,然後的LocationManager使用即時更新(這應該立即更新LOC):

public class GeoUpdateHandler implements LocationListener { 
    public void onLocationChanged(Location location) { 
    loc = location; 
    } 
    public void onProviderDisabled(String provider) { } 
    public void onProviderEnabled(String provider) { } 
    public void onStatusChanged(String provider, int status, Bundle extras) { } 
} 

顯然這個更新沒有發生。

任何人都可以告訴我,如果我的代碼是愚蠢的,或建議更好的方式,以確保我總是處理當前的位置?謝謝。道歉,如果這是回答,很難找到位置& requestLocationUpdates標籤上的所有帖子。

+0

您絕對肯定知道您的應用實際上在移動位置後重新啓動?你可以檢查logcat確定。此外,獲取GPS定位可能需要一些時間。除非有另一個應用程序頻繁地針對GPS更新進行輪詢,否則您將無法立即獲得更新。 –

+0

David-I認爲該應用程序已關閉,因爲它自上次使用以來已超過24小時。我沒有檢查logcat,因爲這是在現場電話上,這比我習慣的更加煩瑣。您對即時投票和更新的評論聽起來很正確,但我想知道是否有任何方式通知用戶,以便他們不會使用錯誤的位置,並且可以儘快得到更新? – iaindownie

+1

這有點困難,因爲有很多變量和條件等等。你可以嘗試的一件事是用'Location.getTime()'檢查你的位置的時間戳,看看它是否是「陳舊」。這可能對基於GPS的位置有幫助(我知道它對基於網絡的位置沒有幫助) –

回答

2

在聊天討論後,我建議如下:

你需要調用requestLocationUpdates(),然後向用戶顯示一個對話框,說像「讓你的位置」。在某段時間後,您應該得到回調onLocationChanged()與最新的位置。此時,您可以關閉對話框並更新文本字段以及任何其他要顯示給用戶的內容。一旦獲得最新的位置,您還應該致電removeUpdates(),以免耗盡用戶的電池。