2013-03-16 19 views
5

Chcę wiedzieć, czy w Androidzie (GingerBread) istnieje sposób na sprawdzenie, czy GPS coś robi, czy nie. Pozwól mi być nieco bardziej jasne: ja po prostu chcę wywołać jakąś metodę lub api, że powie mi wheter GPS jest:Android: sprawdź, czy GPS wyszukuje, naprawił lub nie jest używany

1) Stała (ikona GPS w pasku stanu na)
2) Wyszukiwanie fix (ikona GPS na pasku stanu miga)
3) Nieaktywne (nie aplikacja jest korzystanie z usług lokalizacji w tej chwili, nie ikonę na pasku stanu)

teraz: wiem, że można używać LocationListener być powiadomiony o takich zmianach, ale to nie jest dobre dla mnie, ponieważ nie chcę, aby mój kod pozostał uruchomiony oczekując na zdarzenia, mój kod działa okresowo w zaplanowanym czasie, robi coś, a następnie kończy się, więc potrzebuję sposobu na sprawdzenie stanu usługi GPS w tym konkretnym momencie, zamiast czekać na powiadomienia o tym, kiedy to się zmieni.

+0

Może to pomaga? http://stackoverflow.com/a/3712727/1318830 –

+0

Nie przetestowałem tego kodu, ale patrząc na niego wygląda na to, że zwykle: subskrybuje i czeka na zdarzenie GPS Status Changed. Chciałbym natychmiast poznać aktualny status, na przykład wywołać metodę/api, która zwróci tylko bieżący status i to wszystko. –

+0

jest wiele odpowiedzi w tym wierszu, które ogólnie dają szerszy widok, jak możesz to zrobić, jak http: // stackoverflow.com/a/4084800/1318830 –

Odpowiedz

12

Po wykonaniu wielu testów na GPS, w końcu znalazłem rozwiązanie. Gdy aplikacja Android dzwoni do menedżera lokalizacji i GPS rozpoczyna wyszukiwanie, uruchamiane jest jedno zdarzenie, a także, gdy gps jest zablokowane, uruchamiane jest kolejne zdarzenie. Poniższy kod pokazuje, jak to zrobić.

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

/* * Jest to funkcja GPSListener wywoływany gdy różne imprezy wystąpi jak zaczął * GPS, GPS zatrzymany, GPS zablokowana */

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

Lepiej umieścić kod GPS i jako usługa uzyskiwania informacji o lokalizacji GPS.

Za każdym razem, gdy wywołasz funkcję GPS, rejestrator GPSStatus jest zarejestrowany. Tostowanie GPS_SEARCHING przychodzi tylko raz, gdy GPS rozpoczyna wyszukiwanie, a GPS_LOCKED wyświetla toast, gdy GPS jest zablokowany. Jeśli ponownie zadzwonimy do funkcji GPS, zdarzenie GPS_EVENT_FIRST_FIX zostanie wyzwolone, jeśli jest zablokowane (wyświetla tok GPS_LOCKED) i jeśli GPS jest już uruchomiony, nie wyświetli toastu GPS_SEARCHING (tzn. Zdarzenie GPS_STARTED nie zostanie uruchomione). Po wywołaniu zdarzenia GPS_EVENT_FIRST_FIX usuwam aktualizacje odbiornika GPSstatus.

Po uruchomieniu zdarzenia GPS_EVENT_FIRST_FIX, lepiej jest wywołać funkcję gpslastknownlocation(), aby uzyskać najnowszą najnowszą poprawkę GPS. (Lepiej zajrzeć na stronę dla programistów Androida, aby uzyskać więcej informacji).

Mam nadzieję, że to pomoże innym ....

+0

Nie potrzebuję tego więcej i nie mam czasu na sprawdzenie, ale przyjmuję odpowiedź, dziękuję za poświęcony czas i wysiłek. –

+2

Chcę uruchomić funkcję po odblokowaniu stanu GPS po zablokowaniu. Jak mogę to zrobić ? – ssrp

1

Niestety, nie ma łatwego sposobu na uzyskanie "aktualnego stanu" GPS w systemie Android. Jak wskazali inni, najlepiej jest zarejestrować się w wydarzeniu onGpsStatusChanged() i śledzić stan.

Jeśli czujesz się żądny przygód, możesz zadzwonić pod numer $ dumpsys location z powłoki adb, aby uzyskać stan dostawcy GPS. Zwykle dzwonisz pod numer $ adb shell z pulpitu, ale możesz skompilować natywną aplikację powłoki Androida i zadzwonić pod numer exec() z wnętrza obudowy, aby uzyskać wyjście dumpsys bezpośrednio na telefonie.

+0

i czy uważasz to za normalny sposób uzyskania informacji GPS? – axd

Powiązane problemy