28

I'm currently writing an app in Android that works with the GPS. At the moment I'm able to work out whether the GPS is enabled. My problem is that I want to enable the GPS on app startup if it is disabled. How can I do this programmaticaly?

THelper
  • 15,333
  • 6
  • 64
  • 104
Chiwai Chan
  • 4,716
  • 4
  • 30
  • 33

7 Answers7

51

You can't, starting with Android 1.5. The most you can do is pop open the activity to allow the user to toggle it on/off. Use the action held in android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS to craft an Intent to open this activity.

CommonsWare
  • 986,068
  • 189
  • 2,389
  • 2,491
  • 3
    Why is this disabled? Why not allow developers to toggle this? the Power Control widget can, so we should be able to as well. Dont you think? – Adam Lerman Apr 27 '10 at 12:26
  • 24
    It is disabled for privacy reasons. If the user wants GPS off, the user should have GPS off, period. – CommonsWare Apr 27 '10 at 13:13
  • These guys seem to have figured it out. Unfortunately the apk is obfuscated and I could not figure out how it was accomplished. URL:https://market.android.com/details?id=at.abraxas.powerwidget.free&hl=en – Brian Sweeney Jul 20 '11 at 19:39
  • @commonsware but it can actually be done by exploiting a certain loophole up to 2.2. I'm sure you know the details, but for others, see [Enable GPS programatically like Tasker](http://stackoverflow.com/a/5305835/383414) – Richard Le Mesurier Jun 20 '12 at 14:40
  • @RichardLeMesurier: Such security loopholes have been fixed, at least for newer versions of Android. – CommonsWare Jun 20 '12 at 15:19
  • @commonsware That is correct - fixed from 2.3 onwards (as at time of writing 20/06/2012). However some developers require a quick-n-dirty way of doing something, so I like to ensure they can find the hacks when needed. – Richard Le Mesurier Jun 20 '12 at 15:32
  • @RichardLeMesurier: I like to ensure that users can maintain their privacy and security, by maintaining complete control over whether GPS is enabled. – CommonsWare Jun 20 '12 at 15:33
15
if(!LocationManager.isProviderEnabled(android.location.LocationManager.GPS_PROVIDER ))
{
    Intent myIntent = new Intent( Settings.ACTION_SECURITY_SETTINGS );
    startActivity(myIntent);
}
Michael Mrozek
  • 169,610
  • 28
  • 168
  • 175
TS.xy
  • 1,244
  • 2
  • 13
  • 29
  • 8
    This code didn't compile for me on android 2.2, as .isProviderEnabled is not a static method on LocationManager. Working code for me was as follows (apologies for formatting) LocationManager locationManager = (LocationManager) getSystemService(LOCATION_SERVICE); if(!locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER )) { Intent myIntent = new Intent( Settings.ACTION_LOCATION_SOURCE_SETTINGS ); startActivity(myIntent); } – Ben Clayton Jan 28 '11 at 17:26
6

This method code can be help for you

private void turnGPSOnOff(){
  String provider = Settings.Secure.getString(getContentResolver(), Settings.Secure.LOCATION_PROVIDERS_ALLOWED);
  if(!provider.contains("gps")){
    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);
    //Toast.makeText(this, "Your GPS is Enabled",Toast.LENGTH_SHORT).show();
  }
}
William
  • 3,511
  • 27
  • 35
Ashish Dwivedi
  • 8,048
  • 5
  • 58
  • 78
  • 2
    yes **this can be done up to 2.2 (sdk 8)**. For more info, see [Enable GPS programatically like Tasker](http://stackoverflow.com/a/5305835/383414) – Richard Le Mesurier Jun 20 '12 at 14:38
3

You might use the following:

try {
  Settings.Secure.setLocationProviderEnabled(getContentResolver(), LocationManager.GPS_PROVIDER, true);
} catch (Exception e) {
  logger.log(Log.ERROR, e, e.getMessage());
}

but it will only work if you have system signature protection level. So you need to cook your own Image to actually use it :/

icyerasor
  • 4,973
  • 1
  • 43
  • 52
1

First check whether the location service is already on or not ??

Checking location service is enabled or not

public boolean isLocationServiceEnabled(){
    LocationManager locationManager = null;
    boolean gps_enabled= false,network_enabled = false;

    if(locationManager ==null)
        locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
    try{
        gps_enabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
    }catch(Exception ex){
        //do nothing...
    }

    try{
        network_enabled = locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
    }catch(Exception ex){
        //do nothing...
    }

    return gps_enabled || network_enabled;

}

Then finally to open if location service in turned off previously

  if (isLocationServiceEnabled())) {
          //DO what you need...
     } else {
          AlertDialog.Builder builder = new AlertDialog.Builder(this);
          builder.setMessage("Seems Like location service is off,   Enable this to show map")
      .setPositiveButton("YES", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialogInterface, int i) {
                             Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
                                    startActivity(intent);
                                }
                            }).setNegativeButton("NO THANKS", null).create().show();
                }
yubaraj poudel
  • 3,821
  • 1
  • 31
  • 28
0

You should use the Location Settings Dialog in Play Services that prompts the user to enable location services (if necessary) with just one click.

Greg Ennis
  • 14,917
  • 2
  • 69
  • 74
-5

if your question is at the user level of android these properties are located in: "Settings -> Location -> Use wireless networks" -> "Settings -> Location -> Use GPS satellites".

But at the developer can use the class "android.provider.Settings.Secure" with the appropriate permissions.

Reno
  • 33,594
  • 11
  • 89
  • 102