2013-03-16 2 views
5

Ich möchte wissen, ob es einen Weg in Android (GingerBread) zu wissen, ob im Moment das GPS etwas tut oder nicht. Lassen Sie mich ein bisschen mehr klar sein: Ich möchte im Grunde eine Methode oder api nennen, die mir sagen wheter das GPS ist:Android: überprüfen, ob GPS sucht, hat fix oder wird nicht verwendet

1) Feste (GPS-Symbol in der Statusleiste auf)
2) Die Suche nach Fix (GPS-Symbol Inaktiv auf statusbar Blinzeln)
3) (keine App ist mit standortbezogene Dienste im Moment kein Symbol auf Statusbar)

Jetzt: ich weiß, dass Sie eine Location solcher Änderungen informiert werden können, aber das ist nicht gut für mich, weil ich nicht möchte, dass mein Code weiterläuft und auf Ereignisse wartet, läuft mein Code periodisch zu geplanten Zeiten, macht etwas und endet dann, also brauche ich eine Möglichkeit, den Status des GPS-Dienstes in genau diesem Moment zu überprüfen, eher, als warte auf Benachrichtigungen, wann es sich ändert.

+0

Vielleicht hilft das? http://StackOverflow.com/a/3712727/1318830 –

+0

Ich habe diesen Code nicht getestet, aber indem ich es ansehe, scheint es das Übliche zu tun: abonniert und wartet auf ein GPS Status Changed Event. Ich möchte den aktuellen Status sofort wissen, wie zum Beispiel eine Methode/API aufrufen, die nur den aktuellen Status zurückgibt und das war's. –

+0

gibt es viele Antworten in dieser Zeile, die im Allgemeinen eine breitere Sicht geben, wie Sie dazu http: // stackoverflow können.com/a/4084800/1318830 –

Antwort

12

Nachdem ich viele Tests mit GPS gemacht habe, fand ich endlich die Lösung. Wenn die Android-App den Standortmanager und das GPS-Gerät anruft, wird ein Ereignis ausgelöst und auch wenn GPS gesperrt ist, wird ein anderes Ereignis ausgelöst. Der folgende Code zeigt, wie dies zu tun ist.

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

/* * Dies ist GPSListener Funktion aufgerufen wird, wenn verschiedene Ereignisse eintritt wie * GPS gestartet, GPS gestoppt, GPS gesperrt */

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

Es ist besser, GPS-Code setzen in und als Service, um GPS-Standortinformationen zu erhalten.

Jedes Mal, wenn Sie die GPS-Funktion aufrufen, wird der GPSStatus-Listener registriert. GPS_SEARCHING Toast kommt nur einmal, wenn GPS gestartet wird, um zu suchen, und GPS_LOCKED Toast wird angezeigt, wenn GPS gesperrt ist. Wenn wir die GPS-Funktion erneut aufrufen, wird das Ereignis GPS_EVENT_FIRST_FIX ausgelöst, wenn es gesperrt ist (zeigt Toast mit GPS_LOCKED an) und wenn GPS bereits gestartet wurde, wird GPS_SEARCHING-Toast nicht angezeigt (d. H. GPS_STARTED-Ereignis wird nicht ausgelöst). Nachdem das GPS_EVENT_FIRST_FIX-Ereignis ausgelöst wurde, entferne ich die GPSstatus-Listener-Updates.

Wenn das Ereignis GPS_EVENT_FIRST_FIX ausgelöst wird, ist es besser, die Funktion gpslastknownlocation() aufzurufen, um den neuesten GPS-Fix zu erhalten (es ist besser, auf der Android-Entwickler-Website nach weiteren Informationen zu suchen).

Ich hoffe, dies wird anderen helfen ....

+0

Ich brauche das nicht mehr und habe keine Zeit es zu testen, aber ich werde die Antwort akzeptieren, danke für die Zeit und Mühe. –

+2

Ich möchte eine Funktion auslösen, wenn der GPS-Status nach dem Sperren freigeschaltet ist. Wie kann ich das machen ? – ssrp

1

Leider gibt es keinen einfachen Weg, um den "aktuellen Zustand" des GPS in Android zu bekommen. Wie andere bereits erwähnt haben, ist es am besten, sich für das Ereignis onGpsStatusChanged() zu registrieren und den Status zu verfolgen.

Wenn Sie sich abenteuerlustig fühlen, können Sie Anruf $ dumpsys location von einer adb-Shell anrufen, um den Zustand des GPS-Anbieters zu erhalten. Normalerweise rufen Sie $ adb shell von Ihrem Desktop, aber Sie können eine native Android-Shell-App kompilieren und eine exec() aus der Shell aufrufen, um die dumpsys-Ausgabe direkt auf dem Telefon zu erhalten.

+0

und Sie betrachten dies als den normalen Weg, GPS-Informationen zu erhalten? – axd