2012-05-01 51 views
1

如果我們想要在Android中獲得一個GPS定位,我們實際上使用已知函數requestSingleUpdate()和LocationManager.GPS_PROVIDER,對吧?requestSingleUpdate(...)不會自動獲取GPS位置

現在我正在使用我的getLocation()函數開啓GPS功能,但設備不會自動建立連接,除非我手動關閉GPS,然後再打開它。 requestSingleUpdate()爲網絡供應商完美地工作,我只是不知道爲什麼這不適用於GPS修復。

下面是我的源代碼的一部分:

的getLocation()被另一個對象具有定時運行,每2分鐘。在的getLocation()如果GPS和網絡上,它試圖獲取GPS在第一分鐘內修復,然後在沒有可用GPS定位的情況下獲取網絡位置。

public boolean getLocation() { 
    // DEBUG 
    Log.d("GPS Connection", "Entering getLocation()"); 
    gpsEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER); 
    networkEnabled = locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER); 

    if(!gpsEnabled && !networkEnabled) 
     return false; 

    if(gpsEnabled && networkEnabled) { 
     // DEBUG 
     Log.d("GPS Connection", "Request GPS Data"); 
     locationManager.requestSingleUpdate(LocationManager.GPS_PROVIDER, gpsLocationListener, Looper.getMainLooper()); 
     gpsGetLocationTimeout = new Timer(); 
     gpsGetLocationTimeout.schedule(new GetNetworkLocation(), GPS_MAX_CONNECTION_TIME_MS); 
    } 

    ... 

回答

6

Android documentation:

這可能需要一段時間才能收到最近的位置。如果需要立即位置 ,應用程序可能會使用 getLastKnownLocation(String)方法。如果用戶禁用提供商 ,則不會收到更新,並且將調用onProviderDisabled(String)方法。一旦 供應商再次啓用,將調用onProviderEnabled(String)方法 並且位置更新將再次開始。

GPS可能需要很長時間才能從冷啓動中獲得。如果您在室內,停車場內,被高樓包圍,手機蹩腳,或者GPS衛星神經處於一種滑稽的心情,您可能永遠都無法獲得GPS。

在某些應用中,我們會做類似於請求GPS位置的事情,如果它在60秒後還沒有到達,請取消該請求,這樣我們就不會殺死手機的電池,永久。

您可以請求上次已知的位置,並檢查其年齡並決定是否近期可以使用。網絡位置是快速且便宜的(就電池使用而言),一個好的策略是使用網絡位置,直到獲得GPS。

我在Android中編寫GPS的經驗是,GPS將做它想做的事情,這在許多方面不是文檔引導您期望的。 GPS需要被視爲可能或可能不可用的東西,並且可以設計程序的邏輯來處理該問題。

+2

無論我是室內還是室外,我期望從使用requestSingleUpdate(..)與GPS的期望是,它應該嘗試獲取應該在通知欄中右邊閃爍的圓圈圖標標記的位置。在我看來,它甚至不會執行任何gps動作。 –