SettingsClient
Stay organized with collections
Save and categorize content based on your preferences.
The main entry point for interacting with the location settings-enabler APIs.
This API makes it easy for an app to ensure that the device's system settings are properly
configured for the app's location needs.
When making a request to location services, the device's system settings may be in a state
that prevents an app from obtaining the location data that it needs. For example, GPS or
Wi-Fi scanning may be switched off. This intent makes it easy to:
- Determine if the relevant system settings are enabled on the device to carry out the
desired location request.
- Optionally, invoke a dialog that allows the user to enable the necessary location
settings with a single tap.
To use this API, first create a LocationSettingsRequest.Builder
and add all of the LocationRequests
that the app will be using:
LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder()
.addLocationRequest(mLocationRequestHighAccuracy)
.addLocationRequest(mLocationRequestBalancedPowerAccuracy);
If the client is using BLE scans to derive location, it can request that BLE be enabled by
calling LocationSettingsRequest.Builder.setNeedBle(boolean)
:
builder.setNeedBle(true);
Then check whether current location settings are satisfied:
Task<LocationSettingsResponse> result =
LocationServices.getSettingsClient(this).checkLocationSettings(builder.build());
When the Task
completes, the
client can check the location settings by looking at the status code from the LocationSettingsResponse
object. The client can also retrieve the current state of the relevant location settings by
calling LocationSettingsResponse.getLocationSettingsStates()
:
task.addOnCompleteListener(new OnCompleteListener<LocationSettingsResponse>() {
@Override
public void onComplete(Task<LocationSettingsResponse> task) {
try {
LocationSettingsResponse response = task.getResult(ApiException.class);
// All location settings are satisfied. The client can initialize location
// requests here.
...
} catch (ApiException exception) {
switch (exception.getStatusCode()) {
case LocationSettingsStatusCodes.RESOLUTION_REQUIRED:
// Location settings are not satisfied. But could be fixed by showing the
// user a dialog.
try {
// Cast to a resolvable exception.
ResolvableApiException resolvable = (ResolvableApiException) exception;
// Show the dialog by calling startResolutionForResult(),
// and check the result in onActivityResult().
resolvable.startResolutionForResult(
OuterClass.this,
REQUEST_CHECK_SETTINGS);
} catch (SendIntentException e) {
// Ignore the error.
} catch (ClassCastException e) {
// Ignore, should be an impossible 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;
}
}
}
});
If the status code is CommonStatusCodes.RESOLUTION_REQUIRED
, the client can call ResolvableApiException.startResolutionForResult(Activity, int)
to bring up a
dialog, asking for the user's permission to modify the location settings to satisfy those
requests. The result of the dialog will be returned via Activity.onActivityResult(int, int, Intent)
. If the client is interested in which
location providers are available, it can retrieve a LocationSettingsStates
from the Intent
by calling LocationSettingsStates.fromIntent(Intent)
:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
final LocationSettingsStates states = LocationSettingsStates.fromIntent(intent);
switch (requestCode) {
case REQUEST_CHECK_SETTINGS:
switch (resultCode) {
case Activity.RESULT_OK:
// All required changes were successfully made
...
break;
case Activity.RESULT_CANCELED:
// The user was asked to change settings, but chose not to
...
break;
default:
break;
}
break;
}
}
Public Methods
Checks if the relevant system settings are enabled on the device to carry out the
desired location requests.
Parameters
locationSettingsRequest
an object that contains all the location requirements that the client is
interested in.
public abstract Task< Boolean
>
isGoogleLocationAccuracyEnabled
()
Except as otherwise noted, the content of this page is licensed under the Creative Commons Attribution 4.0 License
, and code samples are licensed under the Apache 2.0 License
. For details, see the Google Developers Site Policies
. Java is a registered trademark of Oracle and/or its affiliates.
Last updated 2024-10-31 UTC.
[[["Easy to understand","easyToUnderstand","thumb-up"],["Solved my problem","solvedMyProblem","thumb-up"],["Other","otherUp","thumb-up"]],[["Missing the information I need","missingTheInformationINeed","thumb-down"],["Too complicated / too many steps","tooComplicatedTooManySteps","thumb-down"],["Out of date","outOfDate","thumb-down"],["Samples / code issue","samplesCodeIssue","thumb-down"],["Other","otherDown","thumb-down"]],["Last updated 2024-10-31 UTC."],[[["\u003cp\u003eThe \u003ccode\u003eSettingsClient\u003c/code\u003e helps ensure device settings are properly configured for an app's location needs, such as enabling GPS or Wi-Fi scanning.\u003c/p\u003e\n"],["\u003cp\u003eDevelopers can use it to check if location settings are satisfied and optionally prompt the user to enable necessary settings via a dialog.\u003c/p\u003e\n"],["\u003cp\u003eIf location settings are not satisfied, but can be fixed by user intervention, a resolvable exception is provided to show a settings dialog.\u003c/p\u003e\n"],["\u003cp\u003eThe \u003ccode\u003eSettingsClient\u003c/code\u003e also provides a method to determine if Google Location Accuracy is enabled, which is necessary for network-based locations.\u003c/p\u003e\n"],["\u003cp\u003eUpon the user responding to the settings dialog, developers can handle the outcome in the \u003ccode\u003eonActivityResult\u003c/code\u003e method of their Activity.\u003c/p\u003e\n"]]],[],null,["# SettingsClient\n\npublic interface **SettingsClient** implements [HasApiKey](/android/reference/com/google/android/gms/common/api/HasApiKey)\\\u003c[Api.ApiOptions.NoOptions](/android/reference/com/google/android/gms/common/api/Api.ApiOptions.NoOptions)\\\u003e \nThe main entry point for interacting with the location settings-enabler APIs.\n\nThis API makes it easy for an app to ensure that the device's system settings are properly\nconfigured for the app's location needs.\n\nWhen making a request to location services, the device's system settings may be in a state\nthat prevents an app from obtaining the location data that it needs. For example, GPS or\nWi-Fi scanning may be switched off. This intent makes it easy to:\n\n- Determine if the relevant system settings are enabled on the device to carry out the desired location request.\n- Optionally, invoke a dialog that allows the user to enable the necessary location settings with a single tap.\n\nTo use this API, first create a [LocationSettingsRequest.Builder](/android/reference/com/google/android/gms/location/LocationSettingsRequest.Builder)\nand add all of the [LocationRequests](/android/reference/com/google/android/gms/location/LocationRequest)\nthat the app will be using: \n\n```\n LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder()\n .addLocationRequest(mLocationRequestHighAccuracy)\n .addLocationRequest(mLocationRequestBalancedPowerAccuracy);\n```\n\nIf the client is using BLE scans to derive location, it can request that BLE be enabled by\ncalling [LocationSettingsRequest.Builder.setNeedBle(boolean)](/android/reference/com/google/android/gms/location/LocationSettingsRequest.Builder#setNeedBle(boolean)): \n\n```\n builder.setNeedBle(true);\n```\n\nThen check whether current location settings are satisfied: \n\n```\n Task\u003cLocationSettingsResponse\u003e result =\n LocationServices.getSettingsClient(this).checkLocationSettings(builder.build());\n```\n\nWhen the [Task](/android/reference/com/google/android/gms/tasks/Task) completes, the\nclient can check the location settings by looking at the status code from the [LocationSettingsResponse](/android/reference/com/google/android/gms/location/LocationSettingsResponse)\nobject. The client can also retrieve the current state of the relevant location settings by\ncalling [LocationSettingsResponse.getLocationSettingsStates()](/android/reference/com/google/android/gms/location/LocationSettingsResponse#getLocationSettingsStates()): \n\n```\n task.addOnCompleteListener(new OnCompleteListener\u003cLocationSettingsResponse\u003e() {\n @Override\n public void onComplete(Task\u003cLocationSettingsResponse\u003e task) {\n try {\n LocationSettingsResponse response = task.getResult(ApiException.class);\n // All location settings are satisfied. The client can initialize location\n // requests here.\n ...\n } catch (ApiException exception) {\n switch (exception.getStatusCode()) {\n case LocationSettingsStatusCodes.RESOLUTION_REQUIRED:\n // Location settings are not satisfied. But could be fixed by showing the\n // user a dialog.\n try {\n // Cast to a resolvable exception.\n ResolvableApiException resolvable = (ResolvableApiException) exception;\n // Show the dialog by calling startResolutionForResult(),\n // and check the result in onActivityResult().\n resolvable.startResolutionForResult(\n OuterClass.this,\n REQUEST_CHECK_SETTINGS);\n } catch (SendIntentException e) {\n // Ignore the error.\n } catch (ClassCastException e) {\n // Ignore, should be an impossible error.\n }\n break;\n case LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE:\n // Location settings are not satisfied. However, we have no way to fix the\n // settings so we won't show the dialog.\n ...\n break;\n }\n }\n }\n });\n```\n\nIf the status code is [CommonStatusCodes.RESOLUTION_REQUIRED](/android/reference/com/google/android/gms/common/api/CommonStatusCodes#RESOLUTION_REQUIRED), the client can call [ResolvableApiException.startResolutionForResult(Activity, int)](/android/reference/com/google/android/gms/common/api/ResolvableApiException#startResolutionForResult(android.app.Activity,%20int)) to bring up a\ndialog, asking for the user's permission to modify the location settings to satisfy those\nrequests. The result of the dialog will be returned via [Activity.onActivityResult(int, int, Intent)](//developer.android.com/reference/android/app/Activity.html#onActivityResult(int,%20int,%20android.content.Intent)). If the client is interested in which\nlocation providers are available, it can retrieve a [LocationSettingsStates](/android/reference/com/google/android/gms/location/LocationSettingsStates)\nfrom the [Intent](//developer.android.com/reference/android/content/Intent.html) by calling\n[LocationSettingsStates.fromIntent(Intent)](/android/reference/com/google/android/gms/location/LocationSettingsStates#fromIntent(android.content.Intent)): \n\n```\n @Override\n protected void onActivityResult(int requestCode, int resultCode, Intent data) {\n final LocationSettingsStates states = LocationSettingsStates.fromIntent(intent);\n switch (requestCode) {\n case REQUEST_CHECK_SETTINGS:\n switch (resultCode) {\n case Activity.RESULT_OK:\n // All required changes were successfully made\n ...\n break;\n case Activity.RESULT_CANCELED:\n // The user was asked to change settings, but chose not to\n ...\n break;\n default:\n break;\n }\n break;\n }\n }\n``` \n\n### Public Method Summary\n\n|--------------------------------------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|\n| abstract Task\\\u003c[LocationSettingsResponse](/android/reference/com/google/android/gms/location/LocationSettingsResponse)\\\u003e | [checkLocationSettings](/android/reference/com/google/android/gms/location/SettingsClient#checkLocationSettings(com.google.android.gms.location.LocationSettingsRequest))([LocationSettingsRequest](/android/reference/com/google/android/gms/location/LocationSettingsRequest) locationSettingsRequest) Checks if the relevant system settings are enabled on the device to carry out the desired location requests. |\n| abstract Task\\\u003c[Boolean](//developer.android.com/reference/java/lang/Boolean.html)\\\u003e | [isGoogleLocationAccuracyEnabled](/android/reference/com/google/android/gms/location/SettingsClient#isGoogleLocationAccuracyEnabled())() Returns true if the Google Location Accuracy setting is currently enabled. |\n\nPublic Methods\n--------------\n\n#### public abstract Task\\\u003c[LocationSettingsResponse](/android/reference/com/google/android/gms/location/LocationSettingsResponse)\\\u003e\n**checkLocationSettings** ([LocationSettingsRequest](/android/reference/com/google/android/gms/location/LocationSettingsRequest) locationSettingsRequest)\n\nChecks if the relevant system settings are enabled on the device to carry out the\ndesired location requests. \n\n##### Parameters\n\n| locationSettingsRequest | an object that contains all the location requirements that the client is interested in. |\n|-------------------------|-----------------------------------------------------------------------------------------|\n\n#### public abstract Task\\\u003c[Boolean](//developer.android.com/reference/java/lang/Boolean.html)\\\u003e\n**isGoogleLocationAccuracyEnabled** ()\n\nReturns true if the Google Location Accuracy setting is currently enabled. This\nsetting is required for Fused Location Provider APIs to be able to generate network\n(wifi, cell, etc) based locations. If Google Play services is chosen as the platform\n[LocationManager.NETWORK_PROVIDER](//developer.android.com/reference/android/location/LocationManager.html#NETWORK_PROVIDER) (this is the case on all GMS compliant\ndevices, which constitute the vast majority of the Android ecosystem), then this\nsetting is also required for the platform [LocationManager.NETWORK_PROVIDER](//developer.android.com/reference/android/location/LocationManager.html#NETWORK_PROVIDER) to be enabled.\n\nOn Android P and above devices, the Google Location Accuracy setting may be found\nunder location settings. Below Android P, Google Location Accuracy is tied to the\ndevice location mode - it will be enabled if the device is in [Settings.Secure.LOCATION_MODE_BATTERY_SAVING](//developer.android.com/reference/android/provider/Settings.Secure.html#LOCATION_MODE_BATTERY_SAVING) or [Settings.Secure.LOCATION_MODE_HIGH_ACCURACY](//developer.android.com/reference/android/provider/Settings.Secure.html#LOCATION_MODE_HIGH_ACCURACY), and disabled in [Settings.Secure.LOCATION_MODE_SENSORS_ONLY](//developer.android.com/reference/android/provider/Settings.Secure.html#LOCATION_MODE_SENSORS_ONLY)."]]