Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

FusedLocationApi.getLastLocation always null

I'd like to simply retrieve device location in my Android project and in order to do so I use the play-services approach:

    protected synchronized void buildGoogleApiClient() {      mGoogleApiClient = new GoogleApiClient.Builder( MainSearchActivity.this )         .addConnectionCallbacks(new GoogleApiClient.ConnectionCallbacks() {             @Override             public void onConnected( Bundle bundle ){                 Location location = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient);                 if( location == null ){                     LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, new LocationListener() {                         @Override                         public void onLocationChanged(Location location) {                             lastLocation = location;                         }                     });                 }             }             @Override             public void onConnectionSuspended( int i ){              }          })         .addOnConnectionFailedListener(new GoogleApiClient.OnConnectionFailedListener() {             @Override             public void onConnectionFailed( ConnectionResult connectionResult ){                 if( connectionResult.hasResolution() ){                     try {                         // Start an Activity that tries to resolve the error                         connectionResult.startResolutionForResult(MainSearchActivity.this, CONNECTION_FAILURE_RESOLUTION_REQUEST);                     }catch( IntentSender.SendIntentException e ){                         e.printStackTrace();                     }                 }else{                     Utils.logger("Location services connection failed with code " + connectionResult.getErrorCode(), Utils.LOG_DEBUG );                 }             }         })         .addApi(LocationServices.API)         .build();      mGoogleApiClient.connect(); }  public Location retrieveLastLocation(){     Location loc = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient);     if( loc == null)     {      }     return loc; //TODO: What if loc is null? } 

but the loc variable is ALWAYS null. It's as such on different phones, every single time. Also lastLocation, that I try to assign in the onLocationChanged, never changes. Always null.

These are the permission I set for the app

<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="com.vogella.android.locationapi.maps.permission.MAPS_RECEIVE" /> <uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" /> 

I just don't get it: Why can't the LocationServices retrieve a position? I have all geolocation settings enabled on all three the devices I tested on.

like image 232
Marco Zanetti Avatar asked Apr 04 '15 00:04

Marco Zanetti


People also ask

Why does getLastLocation return null?

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.

What is FusedLocationProviderClient Android?

FusedLocationProviderClient is for interacting with the location using fused location provider. (NOTE : To use this feature, GPS must be turned on your device.


2 Answers

The fused Location Provider will only maintain background location if at least one client is connected to it. Now just turning on the location service will not guarantee to store the last known location.

Once the first client connects, it will immediately try to get a location. If your activity is the first client to connect and getLastLocation() is invoked right away in onConnected(), that might not be enough time for the first location to arrive..

I suggest you to launch the Maps app first, so that there is at least some confirmed location, and then test your app.

like image 107
Amit K. Saha Avatar answered Oct 11 '22 20:10

Amit K. Saha


As in this post said, The fused Location Provider will only maintain background location if at least one client is connected to it.

But we can skip the process of launching the Google Maps app to get last location by following way.

What we need to do is

  1. We have to request location update from FusedLocationProviderClient
  2. Then we can get the last location from FusedLocationProviderClient, it wouldn't be null.

Request Location

LocationRequest mLocationRequest = LocationRequest.create(); mLocationRequest.setInterval(60000); mLocationRequest.setFastestInterval(5000); mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY); LocationCallback mLocationCallback = new LocationCallback() {     @Override     public void onLocationResult(LocationResult locationResult) {         if (locationResult == null) {             return;         }         for (Location location : locationResult.getLocations()) {             if (location != null) {                 //TODO: UI updates.             }         }     } }; LocationServices.getFusedLocationProviderClient(context).requestLocationUpdates(mLocationRequest, mLocationCallback, null); 

Get last location

LocationServices.getFusedLocationProviderClient(context).getLastLocation().addOnSuccessListener(new OnSuccessListener<Location>() {         @Override         public void onSuccess(Location location) {             //TODO: UI updates.         }     }); 

For best result requestLocationUpdates in onStart() of the Activity, and then you can get last location.

like image 39
Gunaseelan Avatar answered Oct 11 '22 20:10

Gunaseelan