GpsStatus.Listener works only if GPS is on

android, gps, listener

Solution

Well, `LocationListener` has been provided with:

`onProviderDisabled()`,`onProviderEnabled()` and `onStatusChanged()` for exactly this purpose.

`GpsStatus.Listener` delivers info about GPS service's inner workings. It is not to be used for telling the status pf GPS Provider.

`LocationListener` delivers info about providers. The moment you register `LocationListener` with location provider, `onProviderEnabled()`/`onProviderDisabled()` is called accordingly, and your app can always tell when GPS is turned on or off.

Try this:

public class test extends Activity implements LocationListener{

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        LocationManager lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
        lm.requestLocationUpdates(LocationManager.GPS_PROVIDER,1000,10,this);
    }


    @Override
    public void onLocationChanged(Location location) {
    }

    @Override
    public void onStatusChanged(String s, int i, Bundle bundle) {
    }

    @Override
    public void onProviderEnabled(String s) {
        if(LocationManager.GPS_PROVIDER.equals(s)){
            Toast.makeText(this,"GPS on",Toast.LENGTH_SHORT).show();
        }
    }

    @Override
    public void onProviderDisabled(String s) {
        if(LocationManager.GPS_PROVIDER.equals(s)){
            Toast.makeText(this,"GPS off",Toast.LENGTH_SHORT).show();
        }
    }
}

Problem

in my App I have a GpsStatus.Listener to receive events when the user enables or disables GPS. Everything works fine if GPS is on before I start the app. In this case I receive a GPS_EVENT_STARTED or a GPS_EVENT_STOPPED everytime I toggle GPS on or off. The problem is if GPS is off while app is starting. In this case I don't receive an event if I toggle GPS on or off. Can someone explain that to me? Here is my code: ``` public class GPSTracker implements android.location.GpsStatus.Listener { private final Context context; private final LocationListener locListener; private LocationManager locationManager; private boolean isGPSEnabled = false; public GPSTracker(Context context, LocationListener locListener) { this.context = context; this.locListener = locListener; setupGPS(); } private void setupGPS() { locationManager = (LocationManager) getContext().getSystemService(Context.LOCATION_SERVICE); locationManager.addGpsStatusListener(this); isGPSEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER); if(!isGPSEnabled) { Toast.makeText(getContext(), "GPS disabled", Toast.LENGTH_SHORT).show(); } else { locationManager.removeUpdates(locListener); locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, MIN_TIME, MIN_DISTANCE, locListener); } } @Override public void onGpsStatusChanged(int event) { Log.e("onGpsStatusChanged", event+""); switch(event) { case GpsStatus.GPS_EVENT_STARTED: Log.e("onGpsStatusChanged", "GPS_EVENT_STARTED"); break; case GpsStatus.GPS_EVENT_STOPPED: Log.e("onGpsStatusChanged", "GPS_EVENT_STOPPED"); break; } } ``` So, my logcat output is (if GPS is on while starting): - GpsStatusChanged(24638): 1 // app starts - GpsStatusChanged(24638): GPS_EVENT_STARTED - GpsStatusChanged(24638): 4 // searching for fixes - GpsStatusChanged(24638): 4 - GpsStatusChanged(24638): 2 // toggle GPS off - GpsStatusChanged(24638): GPS_EVENT_STOPED Output with GPS off: nothing.

Original source