Fabrizio Mazzoni
Fabrizio Mazzoni

Reputation: 1909

location data null with .getLastLocation() FusedLocationProviderClient

I am getting coordinates with FusedLocationProviderClient in my application on a button click to store into a database. The issue is that when I reboot the phone or the emulator the .getLastLocation() is null and I have to click another time the button i order for this to work. Is there a way to force to get a current position if the value of location from .lastKnownPosition() is null?

// Google fused location client for GPS position
private FusedLocationProviderClient flpc;
// Vars to store GPS info
public Double latitude, longitude;
public Float accuracy;


// Google Fused Client for location
public void getLocation() {
    // FusedLocationProviderClient
    flpc = LocationServices.getFusedLocationProviderClient(context);
    if (ActivityCompat.checkSelfPermission(context, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(context, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
        ......
        return;
    }

    // Get the latest position from device
    Task<Location> task = flpc.getLastLocation();

    task.addOnSuccessListener(new OnSuccessListener<Location>() {
        @Override
        public void onSuccess(Location location) {
            if(location!=null) {
                latitude = location.getLatitude();
                longitude = location.getLongitude();
                accuracy = location.getAccuracy();
            }
        }
    });
}

In my button handler I call getLocation() and use latitude, longitude and accuracy to store to the database.

Any help appreciated!

Upvotes: 7

Views: 7825

Answers (2)

tenprint
tenprint

Reputation: 1157

When getLastLocation() is null, you need to make a LocationRequest

private LocationRequest locationRequest;
private LocationCallback locationCallback;

...

locationRequest = LocationRequest.create();
locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
locationRequest.setInterval(20 * 1000);
locationCallback = new LocationCallback() {
    @Override
    public void onLocationResult(LocationResult locationResult) {
        if (locationResult == null) {
            return;
        }
        for (Location location : locationResult.getLocations()) {
            if (location != null) {
                wayLatitude = location.getLatitude();
                wayLongitude = location.getLongitude();
                txtLocation.setText(String.format(Locale.US, "%s -- %s", wayLatitude, wayLongitude));
            }
        }
    }
};
mFusedLocationClient.requestLocationUpdates(locationRequest, locationCallback, Looper.getMainLooper())

If you don't need continuous updates, you can remove the request once you've received it.

mFusedLocationClient.removeLocationUpdates(locationCallback);

More info here: https://medium.com/@droidbyme/get-current-location-using-fusedlocationproviderclient-in-android-cb7ebf5ab88e

Upvotes: 16

Thamim
Thamim

Reputation: 328

When the phone is rebooted the cached last location is lost so if you didnt open up an app that uses GPS like google maps or something then there will be no last location.

There never has to be a location returned to you, you should always assume it could be null.

If you want to get location, you just need to use LocationCallback as @tenprint said in this thread.

Refer this links

Android get location is null after phone reboot

Upvotes: 5

Related Questions