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.
I am using FusedLocationProvider api in my app, Here is my code that works both on device and emulator -
this is working code of mine.
Hope my code help you.
Cheers..
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.I suggest you to launch Maps app first, so that there is at least some confirmed location and then test your app.
I was facing the same issue. In my case, the problem was with allowing the permissions for the application. I had denied the FINE LOCATION permission that was asked when the first time app started.
Worked in my case !!
With android
APILEVEL
above 23 you need some run time permissions. Location serviceACCESS_COARSE_LOCATION
,ACCESS_FINE_LOCATION
are also need permissions.Checkout this documentation https://developer.android.com/training/permissions/requesting.html
Try this,
This is the exact solution. But I wanted to add some little explanation steps so that anybody gets the exact concepts. Why it is returning null, I agree to follow Amit K answer. But, to guarantee on avoiding location NullPointerException, you start your location related processing inside onLocationChanged() callback.
1) onCreate() of Android Component (Eg, Activity, Fragment or Service. Note: Not IntentService), build and then connect the GoogleApiClient as below.
where, buildGoogleApiClient() implementation is,
Later on onDestroy(), you can disconnect GoogleApiClient as,
The step 1 makes sure you build and connect the GoogleApiClient.
1) GoogleApiClient instance first time gets connected on method onConnected(). Now, your next step should look onConnected() method.
Above, you called a method createLocationRequest() to create location request. The method createLocationRequest() looks like below.
3) Now, on onLocationChange() callback of LocationListener interface, you get new location.
You get the result like this in Logcat: 03-22 18:34:17.336 817-817/com.LiveEarthquakesAlerts I/LocationTracker: Location: Location[fused 37.421998,-122.084000 acc=20 et=+15m35s840ms alt=0.0]
Note: The location above got is Google Headquarter's location although I am in Arkansas. This happens when you use Emulator. On real device, it shows correct address.
To be able to do these three steps, you should have configured your build.gradle as below: