The second Android 11 Developer Preview is now available, test it out and share your feedback.

Get the last known location

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.

Specifically, use the fused location provider 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.

Note: When your app is running in the background, access to location should be critical to the core functionality of the app and is accompanied with proper disclosure to users.

This lesson shows you how to make a single request for the location of a device using the getLastLocation() method in the fused location provider.

Set up Google Play services

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 SDK Manager and add the library to your project. For details, see the guide to Setting Up Google Play Services.

Specify app permissions

Apps that use location services must request location permissions. Android offers the following location permissions:

To access the device's location, request either ACCESS_COARSE_LOCATION or ACCESS_FINE_LOCATION. The permission you choose determines the accuracy of the location returned by the FusedLocationProviderClient API:

  • If you specify ACCESS_COARSE_LOCATION, the API can use Wi-Fi, mobile cell data, or both to determine the device's location. The API returns the location with an accuracy approximately equivalent to a city block.
  • If you specify ACCESS_FINE_LOCATION, the API can determine as precise a location as possible from the available location providers, including the GPS as well as Wi-Fi and mobile cell data.

If you target Android 10 (API level 29) or higher and need to access the device location while your app is in the background, you must also declare the ACCESS_BACKGROUND_LOCATION permission. To learn more, see the guide on how to receive periodic location updates.

This lesson requires only coarse location. Request this permission with the uses-permission element in your app manifest, as the following code snippet shows:

<manifest xmlns:android=""
    package="" >

  <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>

Create location services client

In your activity's onCreate() method, create an instance of the Fused Location Provider Client as the following code snippet shows.


private lateinit var fusedLocationClient: FusedLocationProviderClient

override fun onCreate(savedInstanceState: Bundle?) {
    // ...

    fusedLocationClient = LocationServices.getFusedLocationProviderClient(this)


private FusedLocationProviderClient fusedLocationClient;

// ..

protected void onCreate(Bundle savedInstanceState) {
    // ...

    fusedLocationClient = LocationServices.getFusedLocationProviderClient(this);

Get the last known location

Once you have created the Location Services client 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 getLastLocation() 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 Specify App Permissions section of this document.

To request the last known location, call the getLastLocation() method. The following code snippet illustrates the request and a simple handling of the response:


        .addOnSuccessListener { location : Location? ->
            // Got last known location. In some rare situations this can be null.


        .addOnSuccessListener(this, new OnSuccessListener<Location>() {
            public void onSuccess(Location location) {
                // Got last known location. In some rare situations this can be null.
                if (location != null) {
                    // Logic to handle location object

The getLastLocation() method returns a Task that you can use to get a Location object with the latitude and longitude coordinates of a geographic location. The location object may be null in the following situations:

  • Location is turned off in the device settings. The result could be null even if the last location was previously retrieved because disabling location also clears the cache.
  • The device never recorded its location, which could be the case of a new device or a device that has been restored to factory settings.
  • Google Play services on the device has restarted, and there is no active Fused Location Provider client that has requested location after the services restarted. To avoid this situation you can create a new client and request location updates yourself. For more information, see Receiving Location Updates.

Maintain a current best estimate

You might expect the Location object that's contained in the most recent call to getLastLocation() to be the most accurate. However, because the accuracy of a location varies, the most recent value isn't necessarily the best. You should include logic for choosing which location to show based on several criteria. The set of criteria also varies, depending on the use cases of your app and results from field testing.

To validate the accuracy of a location that's returned from getLastLocation(), complete steps that include the following:

  • Check whether the location retrieved is significantly newer than the previously fetched location.
  • Check whether the accuracy claimed by the location is better or worse than that of the previous estimate.
  • Check the provider that's associated with the new location. Decide whether you trust this provider more than the one used in your app's cached location.