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.
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 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.
An app can use service APIs of Location Kit to obtain the last known location of a device.
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.
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..
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With