I\'m on Android 2.3.7 and I\'m trying to write a BroadcastReceiver that will get called when the user turns GPS on/off (ie: by tapping on the \"use GPS satellites\" in the optio
Starting from API 19 you can listen for the intent action LocationManager.MODE_CHANGED_ACTION.
You can also get the current location mode as follows:
try
{
int locationMode = android.provider.Settings.Secure.getInt(context.getContentResolver(), android.provider.Settings.Secure.LOCATION_MODE);
} catch (android.provider.Settings.SettingNotFoundException e)
{
e.printStackTrace();
}
The value returned should be one of these:
android.provider.Settings.Secure.LOCATION_MODE_BATTERY_SAVING
android.provider.Settings.Secure.LOCATION_MODE_HIGH_ACCURACY
android.provider.Settings.Secure.LOCATION_MODE_OFF
android.provider.Settings.Secure.LOCATION_MODE_SENSORS_ONLY
On API level 9 and higher you can use LocationManager.PROVIDERS_CHANGED_ACTION:
Broadcast intent action when the configured location providers change. For use with
isProviderEnabled(String)
. If you're interacting with theLOCATION_MODE API
, useMODE_CHANGED_ACTION
instead.Constant Value: "android.location.PROVIDERS_CHANGED"
Source
The following solution might be a weird solution but you can try it if you don't find any solution. Another problem with your solution is it works only after api level 9.
in a thread or service you can check the gps status periodically with a very short interval by using
LocationManager manager = (LocationManager) getSystemService(Context.LOCATION_SERVICE );
boolean statusOfGPS = manager.isProviderEnabled(LocationManager.GPS_PROVIDER);
it will use the permission
android.permission.ACCESS_FINE_LOCATION
Even though I am answering this, to me it should not be a good solution. Also there is a chance of minimum period interval delay. Just an option.
Use a LocationListener and override OnStatusChanged
.
You can attach your listener using the requestLocationUpdates(String, long, float, LocationListener)
method on your LocationManager
instance.