| page.title=Getting the Last Known Location | |
| trainingnavtop=true | |
| @jd:body | |
| <div id="tb-wrapper"> | |
| <div id="tb"> | |
| <h2>This lesson teaches you how to</h2> | |
| <ol> | |
| <li><a href="#setup">Set Up Google Play Services</a></li> | |
| <li><a href="#permissions">Specify App Permissions</a></li> | |
| <li><a href="#play-services">Connect to Google Play Services</a></li> | |
| <li><a href="#last-known">Get the Last Known Location</a></li> | |
| </ol> | |
| <h2>You should also read</h2> | |
| <ul> | |
| <li> | |
| <a href="{@docRoot}google/play-services/setup.html">Setting up Google Play | |
| Services</a> | |
| </li> | |
| </ul> | |
| <h2>Try it out</h2> | |
| <ul> | |
| <li> | |
| <a href="https://github.com/googlesamples/android-play-location/tree/master/BasicLocationSample" class="external-link">BasicLocationSample</a> | |
| </li> | |
| </ul> | |
| </div> | |
| </div> | |
| <p>Using the Google Play services location APIs, your app can request the last | |
| known location of the user's device. In most cases, you are interested in the | |
| user's current location, which is usually equivalent to the last known | |
| location of the device.</p> | |
| <p>Specifically, use the | |
| <a href="{@docRoot}reference/com/google/android/gms/location/FusedLocationProviderApi.html">fused | |
| location provider</a> to retrieve the device's last known location. The fused | |
| location provider is one of the location APIs in Google Play services. It | |
| manages the underlying location technology and provides a simple API so that | |
| you can specify requirements at a high level, like high accuracy or low power. | |
| It also optimizes the device's use of battery power.</p> | |
| <p>This lesson shows you how to make a single request for the location of a | |
| device using the | |
| <a href="{@docRoot}reference/com/google/android/gms/location/FusedLocationProviderApi.html#getLastLocation(com.google.android.gms.common.api.GoogleApiClient)">{@code getLastLocation()}</a> | |
| method in the fused location provider. | |
| <h2 id="setup">Set Up Google Play Services</h2> | |
| <p>To access the fused location provider, your app's development project must | |
| include Google Play services. Download and install the Google Play services | |
| component via the <a href="{@docRoot}tools/help/sdk-manager.html">SDK | |
| Manager</a> and add the library to your project. For details, see the guide to | |
| <a href="{@docRoot}google/play-services/setup.html">Setting Up Google Play | |
| Services</a>.</p> | |
| <h2 id="permissions">Specify App Permissions</h2> | |
| <p>Apps that use location services must request location permissions. Android | |
| offers two location permissions: | |
| {@link android.Manifest.permission#ACCESS_COARSE_LOCATION ACCESS_COARSE_LOCATION} | |
| and | |
| {@link android.Manifest.permission#ACCESS_FINE_LOCATION ACCESS_FINE_LOCATION}. | |
| The permission you choose determines the accuracy of the location returned by | |
| the API. If you specify | |
| {@link android.Manifest.permission#ACCESS_COARSE_LOCATION ACCESS_COARSE_LOCATION}, | |
| the API returns a location with an accuracy approximately equivalent to a city | |
| block.</p> | |
| <p>This lesson requires only coarse location. Request this permission with the | |
| {@code uses-permission} element in your app manifest, as the following code | |
| snippet shows: | |
| <pre> | |
| <manifest xmlns:android="http://schemas.android.com/apk/res/android" | |
| package="com.google.android.gms.location.sample.basiclocationsample" > | |
| <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/> | |
| </manifest> | |
| </pre> | |
| <h2 id="play-services">Connect to Google Play Services</h2> | |
| <p>To connect to the API, you need to create an instance of the | |
| Google Play services API client. For details about using the client, see | |
| the guide to | |
| <a href="{@docRoot}google/auth/api-client.html#Starting">Accessing Google | |
| APIs</a>. | |
| </p> | |
| <p>In your activity's {@link android.app.Activity#onCreate onCreate()} method, | |
| create an instance of Google API Client, using the | |
| <a href="{@docRoot}reference/com/google/android/gms/common/api/GoogleApiClient.Builder.html">{@code GoogleApiClient.Builder}</a> class to add the | |
| <a href="{@docRoot}reference/com/google/android/gms/location/LocationServices.html"> | |
| {@code LocationServices}</a> | |
| API, as the following code snippet shows.</p> | |
| <pre> | |
| // Create an instance of GoogleAPIClient. | |
| if (mGoogleApiClient == null) { | |
| mGoogleApiClient = new GoogleApiClient.Builder(this) | |
| .addConnectionCallbacks(this) | |
| .addOnConnectionFailedListener(this) | |
| .addApi(LocationServices.API) | |
| .build(); | |
| } | |
| </pre> | |
| <p>To connect, call | |
| <a href="{@docRoot}reference/com/google/android/gms/common/api/GoogleApiClient#connect()"> | |
| {@code connect()}</a> | |
| from the activity's | |
| <a href="{@docRoot}reference/android/app/Activity.html#onStart()">{@code onStart()}</a> | |
| method. To disconnect, call | |
| <a href="{@docRoot}reference/com/google/android/gms/common/api/GoogleApiClient#disconnect()"> | |
| {@code disconnect()}</a> from the activity's | |
| <a href="{@docRoot}reference/android/app/Activity.html#onStop()"> | |
| {@code onStop()}</a> method. The following snippet shows an example of how | |
| to use both of these methods. | |
| </p> | |
| <pre> | |
| protected void onStart() { | |
| mGoogleApiClient.connect(); | |
| super.onStart(); | |
| } | |
| protected void onStop() { | |
| mGoogleApiClient.disconnect(); | |
| super.onStop(); | |
| } | |
| </pre> | |
| <h2 id="last-known">Get the Last Known Location</h2> | |
| <p>Once you have connected to Google Play services and the location services | |
| API, you can get the last known location of a user's device. When your app is | |
| connected to these you can use the fused location provider's | |
| <a href="{@docRoot}reference/com/google/android/gms/location/FusedLocationProviderApi.html#getLastLocation(com.google.android.gms.common.api.GoogleApiClient)">{@code getLastLocation()}</a> | |
| method to retrieve the device location. The precision of the location returned | |
| by this call is determined by the permission setting you put in your app | |
| manifest, as described in the <a href="#permissions">Specify App | |
| Permissions</a> section of this document.</p> | |
| <p>To request the last known location, call the | |
| <a href="{@docRoot}reference/com/google/android/gms/location/FusedLocationProviderApi.html#getLastLocation(com.google.android.gms.common.api.GoogleApiClient)">{@code getLastLocation()}</a> | |
| method, passing it your instance of the | |
| <a href="{@docRoot}reference/com/google/android/gms/common/api/GoogleApiClient.html">{@code GoogleApiClient}</a> | |
| object. Do this in the | |
| <a href="{@docRoot}reference/com/google/android/gms/common/api/GoogleApiClient.ConnectionCallbacks.html#onConnected(android.os.Bundle)">{@code onConnected()}</a> | |
| callback provided by Google API Client, which is called when the client is | |
| ready. The following code snippet illustrates the request and a simple | |
| handling of the response:</p> | |
| <pre> | |
| public class MainActivity extends ActionBarActivity implements | |
| ConnectionCallbacks, OnConnectionFailedListener { | |
| ... | |
| @Override | |
| public void onConnected(Bundle connectionHint) { | |
| mLastLocation = LocationServices.FusedLocationApi.getLastLocation( | |
| mGoogleApiClient); | |
| if (mLastLocation != null) { | |
| mLatitudeText.setText(String.valueOf(mLastLocation.getLatitude())); | |
| mLongitudeText.setText(String.valueOf(mLastLocation.getLongitude())); | |
| } | |
| } | |
| } | |
| </pre> | |
| <p>The | |
| <a href="{@docRoot}reference/com/google/android/gms/location/FusedLocationProviderApi.html#getLastLocation(com.google.android.gms.common.api.GoogleApiClient)">{@code getLastLocation()}</a> | |
| method returns a | |
| <a href="{@docRoot}reference/android/location/Location.html">{@code Location}</a> | |
| object from which you can retrieve the latitude and longitude coordinates of a | |
| geographic location. The location object returned may be null in rare cases | |
| when the location is not available.</p> | |
| <p>The next lesson, | |
| <a href="change-location-settings.html">Changing Location Settings</a>, shows | |
| you how to detect the current location settings, and prompt the user to | |
| change settings as appropriate for your app's requirements.</p> |