2013-03-16 56 views
5

我想知道在Android(GingerBread)中是否有辦法知道GPS是否正在做某件事。讓我更清楚一點:我基本上想要調用一些方法或API來告訴我什麼GPS是:Android:檢查GPS是否正在搜索,已修復或未使用

1)固定(狀態欄中的GPS圖標)
2)搜索修復(GPS圖標在狀態條上閃爍)
3)非活動(無應用程序是使用位置服務目前在狀態條上,沒有圖標)

現在:我知道,你可以使用一個LocationListener的通知這樣的變化,但是這是不好的對我而言,因爲我不希望我的代碼繼續等待事件發生,我的代碼會在預定的時間週期性地運行,做一些事情然後終止,所以我需要一種方法來檢查那個精確時刻的GPS服務狀態,而不是等待其更改時間的通知。

+0

也許這有幫助嗎? http://stackoverflow.com/a/3712727/1318830 – 2013-03-16 19:21:50

+0

我還沒有測試過這個代碼,但通過查看它看起來很平常:訂閱並等待GPS狀態改變事件。我想要做的就是立即知道當前狀態,就像調用一些只返回當前狀態的方法/ api一樣,就是這樣。 – 2013-03-16 19:25:15

+0

在這一行中有很多答案,這些答案通常會提供更廣泛的視圖,例如http:// stackoverflow。com/a/4084800/1318830 – 2013-03-16 19:30:27

回答

12

經過大量的GPS測試後,終於找到了解決方案。當Android應用調用位置管理器並且GPS開始搜索時,觸發一個事件,並且當gps被鎖定時另一個事件被觸發。以下代碼顯示瞭如何執行此操作。

locationManager = (LocationManager)mContext.getSystemService(LOCATION_SERVICE); 
isGPSEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER); 
    if (isGPSEnabled) {     
     if (locationManager != null) { 
      // Register GPSStatus listener for events 
      locationManager.addGpsStatusListener(mGPSStatusListener); 
      gpslocationListener = new LocationListener() { 
       public void onLocationChanged(Location loc) {} 
       public void onStatusChanged(String provider, int status, Bundle extras) {} 
       public void onProviderEnabled(String provider) {} 
       public void onProviderDisabled(String provider) {}       
      }; 

       locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 
       MIN_TIME_BW_UPDATES_GPS, MIN_DISTANCE_CHANGE_FOR_UPDATES_GPS, 
       gpslocationListener);   
     } 
    } 

/* *這是當各種事件出現像 * GPS啓動,GPS停止GPSListener函數調用,GPS鎖定 */

public Listener mGPSStatusListener = new GpsStatus.Listener() { 
    public void onGpsStatusChanged(int event) {  
     switch(event) { 
      case GpsStatus.GPS_EVENT_STARTED: 
       Toast.makeText(mContext, "GPS_SEARCHING", Toast.LENGTH_SHORT).show(); 
       System.out.println("TAG - GPS searching: ");       
       break; 
      case GpsStatus.GPS_EVENT_STOPPED:  
       System.out.println("TAG - GPS Stopped"); 
       break; 
      case GpsStatus.GPS_EVENT_FIRST_FIX: 

       /* 
       * GPS_EVENT_FIRST_FIX Event is called when GPS is locked    
       */ 
        Toast.makeText(mContext, "GPS_LOCKED", Toast.LENGTH_SHORT).show(); 
        Location gpslocation = locationManager 
          .getLastKnownLocation(LocationManager.GPS_PROVIDER); 

        if(gpslocation != null) {  
        System.out.println("GPS Info:"+gpslocation.getLatitude()+":"+gpslocation.getLongitude()); 

        /* 
        * Removing the GPS status listener once GPS is locked 
        */ 
         locationManager.removeGpsStatusListener(mGPSStatusListener);     
        }    

       break; 
      case GpsStatus.GPS_EVENT_SATELLITE_STATUS: 
//     System.out.println("TAG - GPS_EVENT_SATELLITE_STATUS"); 
       break;     
     } 
    } 
}; 

這是更好地把GPS代碼和作爲獲取GPS位置信息的服務。

每次如果您撥打GPS功能,GPSStatus監聽器都會被註冊。當GPS開始搜索時,GPS_SEARCHING toast只會出現一次,GPS鎖定時則會顯示GPS_LOCKED toast。如果我們再次調用GPS功能,如果GPS_EVENT_FIRST_FIX事件被鎖定(顯示GPS_LOCKED烤麪包),並且GPS已經開始搜索,則不會顯示GPS_SEARCHING烤麪包(即GPS_STARTED事件不會觸發)。 GPS_EVENT_FIRST_FIX事件觸發後,我將刪除GPSstatus偵聽器更新。

當觸發GPS_EVENT_FIRST_FIX事件時,最好調用gpslastknownlocation()函數來獲取最新的GPS修正(更好地查看Android開發人員網站獲取更多信息)。

我希望這會幫助其他人....

+0

我不需要這個了,也沒有時間去測試它,但我會接受答案,謝謝你的時間和精力。 – 2014-01-03 14:26:42

+2

我想在GPS狀態被鎖定後解鎖時觸發一個功能。我怎樣才能做到這一點 ? – ssrp 2015-03-04 07:34:46

1

不幸的是,有沒有簡單的方法來獲取Android的「當前狀態」的GPS。像其他人指出的那樣,您最好的選擇是註冊onGpsStatusChanged()事件並跟蹤狀態。

如果你覺得冒險,你可以從adb shell調用$ dumpsys location來獲得gps提供者的狀態。您通常從桌面調用​​,但您可以編譯原生android shell應用程序,並在shell中調用exec()以直接在手機上獲取dumpsys輸出。

+0

,你認爲這是獲取GPS信息的正常方式? – axd 2016-12-12 12:33:42

相關問題