How can I enable or disable the GPS programmatically on Android? How can I enable or disable the GPS programmatically on Android? android android

How can I enable or disable the GPS programmatically on Android?


the GPS can be toggled by exploiting a bug in the power manager widget. see this xda thread for discussion.

here's some example code i use

private void turnGPSOn(){    String provider = Settings.Secure.getString(getContentResolver(), Settings.Secure.LOCATION_PROVIDERS_ALLOWED);    if(!provider.contains("gps")){ //if gps is disabled        final Intent poke = new Intent();        poke.setClassName("com.android.settings", "com.android.settings.widget.SettingsAppWidgetProvider");         poke.addCategory(Intent.CATEGORY_ALTERNATIVE);        poke.setData(Uri.parse("3"));         sendBroadcast(poke);    }}private void turnGPSOff(){    String provider = Settings.Secure.getString(getContentResolver(), Settings.Secure.LOCATION_PROVIDERS_ALLOWED);    if(provider.contains("gps")){ //if gps is enabled        final Intent poke = new Intent();        poke.setClassName("com.android.settings", "com.android.settings.widget.SettingsAppWidgetProvider");        poke.addCategory(Intent.CATEGORY_ALTERNATIVE);        poke.setData(Uri.parse("3"));         sendBroadcast(poke);    }}

use the following to test if the existing version of the power control widget is one which will allow you to toggle the gps.

private boolean canToggleGPS() {    PackageManager pacman = getPackageManager();    PackageInfo pacInfo = null;    try {        pacInfo = pacman.getPackageInfo("com.android.settings", PackageManager.GET_RECEIVERS);    } catch (NameNotFoundException e) {        return false; //package not found    }    if(pacInfo != null){        for(ActivityInfo actInfo : pacInfo.receivers){            //test if recevier is exported. if so, we can toggle GPS.            if(actInfo.name.equals("com.android.settings.widget.SettingsAppWidgetProvider") && actInfo.exported){                return true;            }        }    }    return false; //default}


All these answers are not allowed now. Here is the correct one:

For all those still looking for the Answer:

Here is how OLA Cabs and other such apps are doing it.

Add this in your onCreate

if (googleApiClient == null) {    googleApiClient = new GoogleApiClient.Builder(this)            .addApi(LocationServices.API).addConnectionCallbacks(this)            .addOnConnectionFailedListener(Login.this).build();    googleApiClient.connect();            LocationRequest locationRequest = LocationRequest.create();    locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);    locationRequest.setInterval(30 * 1000);    locationRequest.setFastestInterval(5 * 1000);    LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder()            .addLocationRequest(locationRequest);    // **************************    builder.setAlwaysShow(true); // this is the key ingredient    // **************************    PendingResult<LocationSettingsResult> result = LocationServices.SettingsApi            .checkLocationSettings(googleApiClient, builder.build());    result.setResultCallback(new ResultCallback<LocationSettingsResult>() {        @Override        public void onResult(LocationSettingsResult result) {            final Status status = result.getStatus();            final LocationSettingsStates state = result                    .getLocationSettingsStates();            switch (status.getStatusCode()) {            case LocationSettingsStatusCodes.SUCCESS:                // All location settings are satisfied. The client can                // initialize location                // requests here.                break;            case LocationSettingsStatusCodes.RESOLUTION_REQUIRED:                // Location settings are not satisfied. But could be                // fixed by showing the user                // a dialog.                try {                    // Show the dialog by calling                    // startResolutionForResult(),                    // and check the result in onActivityResult().                    status.startResolutionForResult(Login.this, 1000);                } catch (IntentSender.SendIntentException e) {                    // Ignore the error.                }                break;            case LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE:                // Location settings are not satisfied. However, we have                // no way to fix the                // settings so we won't show the dialog.                break;            }        }    });}

These are the implmented methods:

@Overridepublic void onConnected(Bundle arg0) {    // TODO Auto-generated method stub}@Overridepublic void onConnectionSuspended(int arg0) {    // TODO Auto-generated method stub}@Overridepublic void onConnectionFailed(ConnectionResult arg0) {    // TODO Auto-generated method stub}

Here is the Android Documentation for the same.

This is to help other guys if they are still struggling:

Edit: Adding Irfan Raza's comment for more help.

@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) {     if (requestCode == 1000) {         if(resultCode == Activity.RESULT_OK){             String result=data.getStringExtra("result");          } if (resultCode == Activity.RESULT_CANCELED) {             //Write your code if there's no result          }     } } 


ENABLE GPS:

Intent intent=new Intent("android.location.GPS_ENABLED_CHANGE");intent.putExtra("enabled", true);sendBroadcast(intent);

DISABLE GPS:

Intent intent = new Intent("android.location.GPS_ENABLED_CHANGE");intent.putExtra("enabled", false);sendBroadcast(intent);