Josu Garcia de Albizu
Josu Garcia de Albizu

Reputation: 1148

Android: Check if Location Services Enabled using Fused Location Provider

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.

Upvotes: 19

Views: 32961

Answers (5)

Mayank Sharma
Mayank Sharma

Reputation: 2835

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

                }
    }

Upvotes: 9

Brownsoo Han
Brownsoo Han

Reputation: 4701

If use FusedLocationProviderClient, first we need check Location is enabled in device.

private fun isLocationEnabled(): Boolean {
    val activity: Activity? = this.activity
    val lm = activity?.getSystemService(Context.LOCATION_SERVICE) as? LocationManager
    if (lm != null) {
        val enabled = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
            lm.isLocationEnabled
        } else {
            lm.isProviderEnabled(LocationManager.NETWORK_PROVIDER)
                    || lm.isProviderEnabled(LocationManager.GPS_PROVIDER)
        }
        Log.d(TAG, "isLocationServiceEnabled", enabled)
        return enabled
    }
    return false
}

And then, check LocationSettings.

val request = LocationRequest.create()
        .setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY)

val settingRequest = LocationSettingsRequest.Builder()
        .addLocationRequest(request)
        .build()
// check Location settings for the request
LocationServices.getSettingsClient(context)
        .checkLocationSettings(settingRequest)
        .addOnSuccessListener {
            // OK!!
            // fusedLocationProviderClient.requestLocationUpdates
        }
        .addOnFailureListener {  exception ->
            if (exception  is ResolvableApiException) {
                try {
                    exception.startResolutionForResult(activity, RC_LOCATION_SETTINGS)
                } catch (ex: IntentSender.SendIntentException) {
                    // ignore
                }
            } else {
                // handle other errors
                showFusedDisabledDialog()
            }
        }

also, please check below link.

https://developer.android.com/training/location/change-location-settings

Upvotes: -1

Kumar Snehashish
Kumar Snehashish

Reputation: 45

You can also check like this:

LocationManager service = (LocationManager) getSystemService(LOCATION_SERVICE);
boolean isEnabled = service.isProviderEnabled(LocationManager.GPS_PROVIDER);

Upvotes: 2

S bruce
S bruce

Reputation: 1514

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!

Upvotes: 38

Aryan Najafi
Aryan Najafi

Reputation: 2506

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

Upvotes: 17

Related Questions