Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why is FusedLocationApi.getLastLocation null

I am trying to get location by using FusedLocationApi.getLastLocation and I've got the location permissions in the manifest file:

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

However, I am getting null when I request the location from the system. I was just testing turning off and on location services so it may be related to that (of course, it's ON when I'm trying this). But even after returning null, I'm waiting for onLocationChanged to be called and it's never called. I've also seen a similar question here: FusedLocationApi.getLastLocation always null

Here is my code:

 protected LocationRequest createLocationRequest() {     LocationRequest mLocationRequest = new LocationRequest();     mLocationRequest.setInterval(120000);     mLocationRequest.setFastestInterval(30000);     mLocationRequest.setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY);     return mLocationRequest; }  protected GoogleApiClient getLocationApiClient(){     return new GoogleApiClient.Builder(this)             .addConnectionCallbacks(this)             .addOnConnectionFailedListener(this)             .addApi(LocationServices.API)             .build(); }  LocationRequest locationRequest = createLocationRequest();   @Override public void onLocationChanged(Location location) {     App.setLocation(location); // NEVER CALLED }  @Override public void onConnected(Bundle bundle) {     App.setLocation(LocationServices.FusedLocationApi.getLastLocation(locationApiClient)); //RETURNS NULL     LocationRequest locationRequest = createLocationRequest();     LocationServices.FusedLocationApi.requestLocationUpdates(locationApiClient, locationRequest, this); } 

And on onCreate of my app:

locationApiClient = getLocationApiClient(); locationApiClient.connect(); 

Where this is my application object. Why am I getting null (yes, I do know it may be null in some rare circumstances as stated in the documents, but I'm ALWAYS getting this, not rarely) and still not getting location updates thereafter? It's a real device (Samsung Galaxy S3) without a SIM card, if it helps.

like image 232
Can Poyrazoğlu Avatar asked Apr 22 '15 11:04

Can Poyrazoğlu


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 fused location used for?

The fused location provider is a location API in Google Play services that intelligently combines different signals to provide the location information that your app needs.

Which API is used for continuously obtain the device location?

An app can use service APIs of Location Kit to obtain the last known location of a 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 storing 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..

Then you are setting mLocationRequest.setFastestInterval(30000); which basically means 30 seconds. so at least 30 seconds after and generally according to your setting preferred time is 120 secs, isn't it a very long time if there is no stored last known location at all? plus you are setting battery balanced priority, which will make you waiting longer time.

mLocationRequest.setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY); 

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

like image 198
Amit K. Saha Avatar answered Oct 05 '22 23:10

Amit K. Saha


I am using FusedLocationProvider api in my app, Here is my code that works both on device and emulator -

  @Override   protected void onCreate(Bundle savedInstanceState){      //put your code here      ....      getLocation();    }   private void getLocation(){     locationRequest = LocationRequest.create();     locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);     locationRequest.setInterval(LOCATION_INTERVAL);     locationRequest.setFastestInterval(LOCATION_INTERVAL);     fusedLocationProviderApi = LocationServices.FusedLocationApi;     googleApiClient = new GoogleApiClient.Builder(this)     .addApi(LocationServices.API)     .addConnectionCallbacks(this)     .addOnConnectionFailedListener(this)     .build();     if (googleApiClient != null) {         googleApiClient.connect();     } }      @Override    public void onConnected(Bundle arg0) {         fusedLocationProviderApi.requestLocationUpdates(googleApiClient,  locationRequest, this);    }     @Override    public void onLocationChanged(Location location) {         Toast.makeText(mContext, "location :"+location.getLatitude()+" , "+location.getLongitude(), Toast.LENGTH_SHORT).show();     } 

this is working code of mine.

Hope my code help you.

Cheers..

like image 26
Ravi Bhandari Avatar answered Oct 05 '22 23:10

Ravi Bhandari