0

I am trying to enable/disable (toggle) GPS programmatically in my app via a button click, but it is not working. Please help. My target devices are not rooted.

Here's the code I'm using.

private void gps()
{
Intent intent=new Intent("android.location.GPS_ENABLED_CHANGE");
Button gps = (Button)findViewById(R.id.gpsButton);
if(isGPSon())
    {
    intent.putExtra("enabled", true);
    gps.setText(R.string.f2_gps_deact);
    }
else
    {
    intent.putExtra("enabled", false);
    gps.setText(R.string.f2_gps_act);
    }
sendBroadcast(intent);
narendranathjoshi
  • 2,426
  • 2
  • 17
  • 19
  • possible duplicate of [Enable GPS programatically like Tasker](http://stackoverflow.com/questions/4721449/enable-gps-programatically-like-tasker) – FoamyGuy Jul 23 '12 at 17:07

4 Answers4

2

You can't enable GPS programatically. The most you can do is open the settings for the user to do that.

You can do it like this:

startActivityForResult(new Intent(android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS), 100);
MobileCushion
  • 6,975
  • 7
  • 40
  • 62
  • Then how do 3rd party apps like Go Switch widgets do it? – narendranathjoshi Jul 23 '12 at 19:09
  • As far as I know, there seemed to be some kind of exploit that enabled to switch access to GPS data. But apparently that was fixed in 2.3 or so. These subjects have been discussed exhaustively in SO, and everyone seems to reach the same conclusion. If there are widgets that can do it, either they are firmware wids or they exploit any other kind of security flaw, and they shouldn't. – MobileCushion Jul 23 '12 at 20:18
1

I am trying to enable/disable (toggle) GPS programmatically in my app via a button click

This is not possible on modern versions of Android, for obvious privacy reasons.

but it is not working

There is no android.location.GPS_ENABLED_CHANGE action in the Android SDK. There is one used internally, but it merely announces a state change -- it does not actually change the state itself.

CommonsWare
  • 954,112
  • 185
  • 2,315
  • 2,367
1

you can force your app to see if you get a gps signal. if your not receiving signal, you can make a choise dialog, so the user can chose to go to the setings and turn on the gps.

// GPSTracker class
GPSTracker gps;

// CHECK GPS!
gps = new GPSTracker(YourActivityClass.this);
if (gps.canGetLocation()) {
} else {
    gps.showSettingsAlert();

        }

Then make a new class file and paste this code in it.. I did not write this code. i found it somewhere, dont remember where i got it from.

 import android.app.AlertDialog;
 import android.app.Service;
 import android.content.Context;
 import android.content.DialogInterface;
 import android.content.Intent;
 import android.location.Location;
 import android.location.LocationListener;
 import android.location.LocationManager;
 import android.os.Bundle;
 import android.os.IBinder;
 import android.provider.Settings;
 import android.util.Log;

 public class GPSTracker extends Service implements LocationListener {

private final Context mContext;

// flag for GPS status
boolean isGPSEnabled = false;

// flag for network status
boolean isNetworkEnabled = false;

// flag for GPS status
boolean canGetLocation = false;

Location location; // location
double latitude; // latitude
double longitude; // longitude

// The minimum distance to change Updates in meters
private static final long MIN_DISTANCE_CHANGE_FOR_UPDATES = 10; // 10 meters

// The minimum time between updates in milliseconds
private static final long MIN_TIME_BW_UPDATES = 1000 * 60 * 1; // 1 minute

// Declaring a Location Manager
protected LocationManager locationManager;

public GPSTracker(Context context) {
    this.mContext = context;
    getLocation();
}

public Location getLocation() {
    try {
        locationManager = (LocationManager) mContext
                .getSystemService(LOCATION_SERVICE);

        // getting GPS status
        isGPSEnabled = locationManager
                .isProviderEnabled(LocationManager.GPS_PROVIDER);

        // getting network status
        isNetworkEnabled = locationManager
                .isProviderEnabled(LocationManager.NETWORK_PROVIDER);

        if (!isGPSEnabled || !isNetworkEnabled) {
            // no network provider is enabled
        } else {
            this.canGetLocation = true;
            // if GPS Enabled get lat/long using GPS Services
            if (isGPSEnabled) {
                locationManager.requestLocationUpdates(
                        LocationManager.GPS_PROVIDER, MIN_TIME_BW_UPDATES, MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
                Log.d("GPS Enabled", "GPS Enabled");
                if (locationManager != null) {
                    location = locationManager
                            .getLastKnownLocation(LocationManager.GPS_PROVIDER);
                    if (location != null) {
                        latitude = location.getLatitude();
                        longitude = location.getLongitude();
                    }
                }
            }
            if (isNetworkEnabled) {
                if (locationManager == null) {
                    locationManager.requestLocationUpdates(
                            LocationManager.NETWORK_PROVIDER, MIN_TIME_BW_UPDATES, MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
                    Log.d("Network", "Network");
                    if (locationManager != null) {
                        location = locationManager
                                .getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
                        if (location != null) {
                            latitude = location.getLatitude();
                            longitude = location.getLongitude();
                        }
                    }
                }
            }
        }

    } catch (Exception e) {
        e.printStackTrace();
    }

    return location;
}

/**
 * Stop using GPS listener
 * Calling this function will stop using GPS in your app
 * */
public void stopUsingGPS(){
    if(locationManager != null){
        locationManager.removeUpdates(GPSTracker.this);
    }
}

/**
 * Function to get latitude
 * */
public double getLatitude(){
    if(location != null){
        latitude = location.getLatitude();
    }

    // return latitude
    return latitude;
}

/**
 * Function to get longitude
 * */
public double getLongitude(){
    if(location != null){
        longitude = location.getLongitude();
    }

    // return longitude
    return longitude;
}

/**
 * Function to check GPS/wifi enabled
 * @return boolean
 * */
public boolean canGetLocation() {
    return this.canGetLocation;
}

/**
 * Function to show settings alert dialog
 * On pressing Settings button will lauch Settings Options
 * */
public void showSettingsAlert(){
    AlertDialog.Builder alertDialog = new AlertDialog.Builder(mContext);

    // Setting Dialog Title
    alertDialog.setTitle("GPS settings");

    // Setting Dialog Message
    alertDialog.setMessage("GPS is not enabled. Do you want to go to settings menu?");

    // On pressing Settings button
    alertDialog.setPositiveButton("Settings", new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialog,int which) {
            Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
            mContext.startActivity(intent);
        }
    });

    // on pressing cancel button
    alertDialog.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialog, int which) {
        dialog.cancel();
        }
    });

    // Showing Alert Message
    alertDialog.show();
}

@Override
public void onLocationChanged(Location location) {
}

@Override
public void onProviderDisabled(String provider) {
}

@Override
public void onProviderEnabled(String provider) {
}

@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
}

@Override
public IBinder onBind(Intent arg0) {
    return null;
}
 }

in my app i have put in the shared prefs so the user can decide if he wants to check the gps or not. you can do it like this..

        SharedPreferences getData = PreferenceManager
            .getDefaultSharedPreferences(getBaseContext());
    String enableGPS = getData.getString("gps", "true");
    boolean enableGPSboolean = Boolean.parseBoolean(enableGPS);

    if (enableGPSboolean == (true)) {

        // CHECK GPS!
        // create class object
        gps = new GPSTracker(AddFish.this);

        if (gps.canGetLocation()) {

        } else {

            gps.showSettingsAlert();

        }
    }
Kazu
  • 67
  • 2
  • 10
0
// location manager

LocationManager locationManager; LocationListener locationListener;

obj_tgl_gps.setOnClickListener(new OnClickListener() {

        public void onClick(View v)
        {
            if (obj_tgl_gps.isChecked())
            {
                Intent intent = new Intent("android.location.GPS_ENABLED_CHANGE");
                intent.putExtra("enabled", true);
                sendBroadcast(intent);
            }
            else
            {
                Intent intent = new Intent("android.location.GPS_ENABLED_CHANGE");
                intent.putExtra("enabled", false);
                sendBroadcast(intent);
            }

        }
    });