252 lines
13 KiB
Plaintext
252 lines
13 KiB
Plaintext
page.title=Changing Location Settings
|
|
trainingnavtop=true
|
|
@jd:body
|
|
|
|
<div id="tb-wrapper">
|
|
<div id="tb">
|
|
|
|
<h2>This lesson teaches you how to</h2>
|
|
<ol>
|
|
<li><a href="#connect">Connect to Location Services</a></li>
|
|
<li><a href="#location-request">Set Up a Location Request</a></li>
|
|
<li><a href="#get-settings">Get Current Location Settings</a></li>
|
|
<li><a href="#prompt">Prompt the User to Change Location Settings</a></li>
|
|
</ol>
|
|
|
|
<h2>You should also read</h2>
|
|
<ul>
|
|
<li>
|
|
<a href="https://developers.google.com/android/guides/setup"
|
|
class="external-link">Setting up Google Play Services</a>
|
|
</li>
|
|
<li>
|
|
<a href="retrieve-current.html">Getting the Last Known Location</a>
|
|
</li>
|
|
</ul>
|
|
</div>
|
|
</div>
|
|
|
|
<p>If your app needs to request location or receive permission updates, the
|
|
device needs to enable the appropriate system settings, such as GPS or Wi-Fi
|
|
scanning. Rather than directly enabling services such as the device's GPS,
|
|
your app specifies the required level of accuracy/power consumption and
|
|
desired update interval, and the device automatically makes the appropriate
|
|
changes to system settings. These settings are defined by the
|
|
<a href="https://developers.google.com/android/reference/com/google/android/gms/location/LocationRequest"
|
|
class="external-link">{@code LocationRequest}</a>
|
|
data object. </p>
|
|
|
|
<p>This lesson shows you how to use the
|
|
<a href="https://developers.google.com/android/reference/com/google/android/gms/location/SettingsApi">Settings API</a>
|
|
to check which settings are enabled, and present the Location Settings
|
|
dialog for the user to update their settings with a single tap.</p>
|
|
|
|
<h2 id="connect">Connect to Location Services</h2>
|
|
|
|
<p>In order to use the location services provided by Google Play Services and
|
|
the fused location provider, connect your app using the
|
|
<a href="{@docRoot}reference/com/google/android/gms/common/api/GoogleApiClient">Google API Client</a>,
|
|
then check the current location settings and prompt the user to enable the
|
|
required settings if needed. For details on connecting with the
|
|
Google API client, see <a href="retrieve-current.html">Getting the Last Known Location</a>.</p>
|
|
|
|
<p>Apps that use location services must request location permissions. For this
|
|
lesson, coarse location detection is sufficient. Request this permission
|
|
with the <code>uses-permission</code> element in your app manifest, as shown
|
|
in the following example:</p>
|
|
|
|
<pre><code><manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
|
package="com.google.android.gms.location.sample.locationupdates" >
|
|
|
|
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
|
|
</manifest>
|
|
</code></pre>
|
|
|
|
<p>If the device is running Android 6.0 or higher, and your app's target
|
|
SDK is 23 or higher, the app has to list the permissions in the manifest
|
|
<em>and</em> request those permissions at run time. For more information, see
|
|
<a href="{@docRoot}training/permissions/requesting.html">Requesting Permissions at Run Time</a>.</p>
|
|
|
|
<h2 id="location-request">Set Up a Location Request</h2>
|
|
|
|
<p>To store parameters for requests to the fused location provider, create a
|
|
<a href="https://developers.google.com/android/reference/com/google/android/gms/location/LocationRequest.html">{@code LocationRequest}</a>.
|
|
The parameters determine the level of accuracy for location requests. For
|
|
details of all available location request options, see the
|
|
<a href="https://developers.google.com/android/reference/com/google/android/gms/location/LocationRequest.html">{@code LocationRequest}</a>
|
|
class reference. This lesson sets the update interval, fastest update
|
|
interval, and priority, as described below:</p>
|
|
|
|
<dl>
|
|
<dt>
|
|
Update interval
|
|
</dt>
|
|
<dd>
|
|
<a href="https://developers.google.com/android/reference/com/google/android/gms/location/LocationRequest.html#setInterval(long)">{@code setInterval()}</a>
|
|
- This method sets the rate in milliseconds at which your app prefers to
|
|
receive location updates. Note that the location updates may be faster than
|
|
this rate if another app is receiving updates at a faster rate, or slower
|
|
than this rate, or there may be no updates at all (if the device has no
|
|
connectivity, for example).
|
|
</dd>
|
|
<dt>
|
|
Fastest update interval
|
|
</dt>
|
|
<dd>
|
|
<a href="https://developers.google.com/android/reference/com/google/android/gms/location/LocationRequest.html#setFastestInterval(long)">{@code setFastestInterval()}</a>
|
|
- This method sets the <strong>fastest</strong> rate in milliseconds at which
|
|
your app can handle location updates. You need to set this rate because
|
|
other apps also affect the rate at which updates are sent. The Google Play
|
|
services location APIs send out updates at the fastest rate that any app
|
|
has requested with
|
|
<a href="https://developers.google.com/android/reference/com/google/android/gms/location/LocationRequest.html#setInterval(long)">{@code setInterval()}</a>.
|
|
If this rate is faster
|
|
than your app can handle, you may encounter problems with UI flicker or data
|
|
overflow. To prevent this, call
|
|
<a href="https://developers.google.com/android/reference/com/google/android/gms/location/LocationRequest.html#setFastestInterval(long)">{@code setFastestInterval()}</a>
|
|
to set an upper limit to the update rate.
|
|
</dd>
|
|
<dt>Priority</dt>
|
|
<dd>
|
|
<p>
|
|
<a href="https://developers.google.com/android/reference/com/google/android/gms/location/LocationRequest.html#setPriority(int)">{@code setPriority()}</a>
|
|
- This method sets the priority of the request, which gives the Google Play
|
|
services location services a strong hint about which location sources to use.
|
|
The following values are supported:</p>
|
|
<ul>
|
|
<li>
|
|
<a href="https://developers.google.com/android/reference/com/google/android/gms/location/LocationRequest.html#PRIORITY_BALANCED_POWER_ACCURACY">{@code PRIORITY_BALANCED_POWER_ACCURACY}</a>
|
|
- Use this setting to request location precision to within a city
|
|
block, which is an accuracy of approximately 100 meters. This is
|
|
considered a coarse level of accuracy, and is likely to consume less
|
|
power. With this setting, the location services are likely to use WiFi
|
|
and cell tower positioning. Note, however, that the choice of location
|
|
provider depends on many other factors, such as which sources are
|
|
available.</li>
|
|
<li>
|
|
<a href="https://developers.google.com/android/reference/com/google/android/gms/location/LocationRequest.html#PRIORITY_HIGH_ACCURACY">{@code PRIORITY_HIGH_ACCURACY}</a>
|
|
- Use this setting to request the most precise location possible. With
|
|
this setting, the location services are more likely to use GPS
|
|
to determine the location.</li>
|
|
<li><a href="https://developers.google.com/android/reference/com/google/android/gms/location/LocationRequest.html#PRIORITY_LOW_POWER">{@code PRIORITY_LOW_POWER}</a>
|
|
- Use this setting to request city-level precision, which is
|
|
an accuracy of approximately 10 kilometers. This is considered a
|
|
coarse level of accuracy, and is likely to consume less power.</li>
|
|
<li><a href="https://developers.google.com/android/reference/com/google/android/gms/location/LocationRequest.html#PRIORITY_NO_POWER">{@code PRIORITY_NO_POWER}</a>
|
|
- Use this setting if you need negligible impact on power consumption,
|
|
but want to receive location updates when available. With this
|
|
setting, your app does not trigger any location updates, but
|
|
receives locations triggered by other apps.</li>
|
|
</ul>
|
|
</dd>
|
|
</dl>
|
|
|
|
<p>Create the location request and set the parameters as shown in this
|
|
code sample:</p>
|
|
|
|
<pre>
|
|
protected void createLocationRequest() {
|
|
LocationRequest mLocationRequest = new LocationRequest();
|
|
mLocationRequest.setInterval(10000);
|
|
mLocationRequest.setFastestInterval(5000);
|
|
mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
|
|
}
|
|
</pre>
|
|
|
|
<p>The priority of
|
|
<a href="{@docRoot}reference/com/google/android/gms/location/LocationRequest.html#PRIORITY_HIGH_ACCURACY">{@code PRIORITY_HIGH_ACCURACY}</a>,
|
|
combined with the
|
|
{@link android.Manifest.permission#ACCESS_FINE_LOCATION ACCESS_FINE_LOCATION}
|
|
permission setting that you've defined in the app manifest, and a fast update
|
|
interval of 5000 milliseconds (5 seconds), causes the fused location
|
|
provider to return location updates that are accurate to within a few feet.
|
|
This approach is appropriate for mapping apps that display the location in
|
|
real time.</p>
|
|
|
|
<p class="note"><strong>Performance hint:</strong> If your app accesses the
|
|
network or does other long-running work after receiving a location update,
|
|
adjust the fastest interval to a slower value. This adjustment prevents your
|
|
app from receiving updates it can't use. Once the long-running work is done,
|
|
set the fastest interval back to a fast value.</p>
|
|
|
|
<h2 id="get-settings">Get Current Location Settings</h2>
|
|
|
|
<p>Once you have connected to Google Play services and the location services
|
|
API, you can get the current location settings of a user's device. To do
|
|
this, create a
|
|
<a href="{@docRoot}reference/com/google/android/gms/location/LocationSettingsRequest.Builder"><code>LocationSettingsRequest.Builder</code></a>,
|
|
and add one or more location requests. The following code snippet shows how
|
|
to add the location request that was created in the previous step:</p>
|
|
|
|
<pre>LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder()
|
|
.addLocationRequest(mLocationRequest);
|
|
</pre>
|
|
|
|
<p>Next check whether the current location settings are satisfied:</p>
|
|
|
|
<pre>PendingResult<LocationSettingsResult> result =
|
|
LocationServices.SettingsApi.checkLocationSettings(mGoogleClient,
|
|
builder.build());</pre>
|
|
|
|
<p>When the <a href="{@docRoot}reference/com/google/android/gms/common/api/PendingResult"><code>PendingResult</code></a>
|
|
returns, your app can check the location settings by looking at the status
|
|
code from the <a href="{@docRoot}reference/com/google/android/gms/location/LocationSettingsResult"><code>LocationSettingsResult</code></a>
|
|
object. To get even more details about the the current state of the relevant
|
|
location settings, your app can call the
|
|
<a href="{@docRoot}reference/com/google/android/gms/location/LocationSettingsResult">{@code LocationSettingsResult}</a>
|
|
object's
|
|
<a href="{@docRoot}reference/com/google/android/gms/location/LocationSettingsResult#getLocationSettingsStates"><code>getLocationSettingsStates()</code></a>
|
|
method.</p>
|
|
|
|
<h2 id="prompt">Prompt the User to Change Location Settings</h2>
|
|
|
|
<p>To determine whether the location settings are appropriate for the location
|
|
request, check the status code from the
|
|
<a href="{@docRoot}reference/com/google/android/gms/location/LocationSettingsResult">{@code LocationSettingsResult}</a>
|
|
object. A status code of <code>RESOLUTION_REQUIRED</code> indicates that the
|
|
settings must be changed. To prompt the user for permission to modify the
|
|
location settings, call
|
|
<a href="{@docRoot}reference/com/google/android/gms/common/api/Status#startResolutionForResult(android.app.Activity, int)">
|
|
{@code startResolutionForResult(Activity, int)}</a>.
|
|
This method brings up a dialog asking for the user's permission to modify
|
|
location settings. The following code snippet shows how to check the location
|
|
settings, and how to call {@code startResolutionForResult(Activity, int)}.
|
|
</p>
|
|
|
|
<pre>result.setResultCallback(new ResultCallback<LocationSettingsResult>()) {
|
|
@Override
|
|
public void onResult(LocationSettingsResult result) {
|
|
final Status status = result.getStatus();
|
|
final LocationSettingsStates = result.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 this can be fixed
|
|
// by showing the user a dialog.
|
|
try {
|
|
// Show the dialog by calling startResolutionForResult(),
|
|
// and check the result in onActivityResult().
|
|
status.startResolutionForResult(
|
|
OuterClass.this,
|
|
REQUEST_CHECK_SETTINGS);
|
|
} catch (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;
|
|
}
|
|
}
|
|
});</pre>
|
|
|
|
<p>The next lesson,
|
|
<a href="receive-location-updates.html">Receiving Location Updates</a>, shows
|
|
you how to receive periodic location updates.</p>
|