Android: Check if Location Services Enabled using Fused Location Provider

30,743

Solution 1

See SettingsApi: check your location request then ensure that the device's system settings are properly configured for the app's location needs.

Solution 2

This android developer training tutorial could help - here's the basics:

Code to run in your Activity onCreate():

 // Create an instance of GoogleAPIClient.
    if (mGoogleApiClient == null) {
        mGoogleApiClient = new GoogleApiClient.Builder(this)
                .addConnectionCallbacks(this)
                .addOnConnectionFailedListener(this)
                .addApi(LocationServices.API)
                .build();
    }

    mGoogleApiClient.connect();

    LocationRequest mLocationRequest = new LocationRequest();
    mLocationRequest.setInterval(10000);
    mLocationRequest.setFastestInterval(5000);
    mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);

    LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder()
            .addLocationRequest(mLocationRequest);

    PendingResult<LocationSettingsResult> result =
            LocationServices.SettingsApi.checkLocationSettings(mGoogleApiClient, builder.build());

    result.setResultCallback(new ResultCallback<LocationSettingsResult>() {
        @Override
        public void onResult(LocationSettingsResult locationSettingsResult) {

            final Status status = locationSettingsResult.getStatus();
            final LocationSettingsStates LS_state = locationSettingsResult.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(LocationByGPS.this, REQUEST_CHECK_SETTINGS);

                    } 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;
            }
        }
    });

Override this Method:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    final LocationSettingsStates states = LocationSettingsStates.fromIntent(data);
    switch (requestCode) {
        case REQUEST_CHECK_SETTINGS:
            switch (resultCode) {
                case Activity.RESULT_OK:
                    // All required changes were successfully made
                    GetUserLocation();//FINALLY YOUR OWN METHOD TO GET YOUR USER LOCATION HERE
                    break;
                case Activity.RESULT_CANCELED:
                    // The user was asked to change settings, but chose not to

                    break;
                default:
                    break;
            }
            break;
    }
}

Remember to Implement these in your class:

public class MyClass extends AppCompatActivity implements
    ActivityCompat.OnRequestPermissionsResultCallback,
    GoogleApiClient.ConnectionCallbacks,
    GoogleApiClient.OnConnectionFailedListener{

  protected static final int REQUEST_CHECK_SETTINGS = 0x1;


  /* 
     your code i.e. with the above code etc....
 */

 }

Good explanation here in this Google developer link.

Cheers!

Solution 3

As now in 2020

Latest , Best and shortest way is

    public boolean isLocationEnabled()
    {
     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
// This is new method provided in API 28
                    LocationManager lm = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
                    return lm.isLocationEnabled();
                } else {
// This is Deprecated in API 28
                    int mode = Settings.Secure.getInt(context.getContentResolver(), Settings.Secure.LOCATION_MODE,
                            Settings.Secure.LOCATION_MODE_OFF);
                    return  (mode != Settings.Secure.LOCATION_MODE_OFF);

                }
    }

Solution 4

You can also check like this:

LocationManager service = (LocationManager) getSystemService(LOCATION_SERVICE);
boolean isEnabled = service.isProviderEnabled(LocationManager.GPS_PROVIDER);
Share:
30,743
Josu Garcia de Albizu
Author by

Josu Garcia de Albizu

Mobile SW Engineer. Facing the life creatively

Updated on July 05, 2022

Comments

  • Josu Garcia de Albizu
    Josu Garcia de Albizu almost 2 years

    According to the Android documentation:

    The Google Location Services API, part of Google Play Services, provides a more powerful, high-level framework that automatically handles location providers, user movement, and location accuracy than the platform location API in android.location.

    But using the fused location provider (from location APIs in Google Play services) I do not know how to check if the user has the location enabled or disabled.

    Using the old android.location it was easy:

    locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
    locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
    

    But I don´t want to use both Google Play Services fused location provider and old android location.

    How could I check if the location is enabled by the user using the Fused Location Provider?

    Thanks in advance.

  • S bruce
    S bruce over 8 years
    I have edited my answer by adding code and another useful link.
  • Mogsdad
    Mogsdad over 8 years
    Looks good - I did a bit of cleanup and fixed your links, but otherwise that's a solid answer. Thanks for taking the advice, and good luck!
  • Nabeel K
    Nabeel K about 8 years
    where is LocationByGPS.this ?
  • scai
    scai over 7 years
    You even fixed several errors contained in the official Android Developer tutorial, awesome.
  • scai
    scai over 7 years
    @NabeelK This is the outer class, probably your SomethingActivity class. See the official tutorial.
  • mehmet
    mehmet over 7 years
    it is clear answer. but it look check location only in create method. is that possible to check this in every time in app. or where sould be added to check everytime location enable or not. if not show dialog
  • S bruce
    S bruce over 7 years
    The example code here is to help you see how the concept works. You can always customise as needed in your implementation. If you are always gonna need to implement after onCreate() then you can create and call it from a custom method or class.
  • Akash Bisariya
    Akash Bisariya almost 7 years
    I need to check these setting on a background service.How to get result on service for this.
  • Ravi Yadav
    Ravi Yadav over 6 years
    I have implemented SettingsClient here :github.com/askfortricks/FusedLocationProviderClient as the SettingsApi is deprecated now.
  • Aliton Oliveira
    Aliton Oliveira over 4 years
    How to enable gps without redirecting the user to configurations? I mean, pop up an alertDialog or snackBar to enable GPS when user clicks on "OK" button.
  • TeKo
    TeKo almost 4 years
    LocationManagerCompat.isLocationEnabled(context.getSystemSer‌​vice(Context.LOCATIO‌​N_SERVICE) as LocationManager) So you don't have to check the SDK Version.