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 ....
Może to pomaga? http://stackoverflow.com/a/3712727/1318830 –
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. –
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 –