Olcay Sönmez
Olcay Sönmez

Reputation: 612

LocationServices.FusedLocationApi.getLastLocation(googleApiClient) is always null on emulator

I don't know whats wrong is with emulator. I can't take locatioan with this command

LocationServices.FusedLocationApi.getLastLocation(googleApiClient)

In my emulator supported the gps and google play service but nothing works for taking the current locaion. The location = null. Need help. Here my code :

  private void configureGoogleApiClient() {
        locationRequest = LocationRequest.create();
        locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
        locationRequest.setInterval(Constant.INTERVAL);
        locationRequest.setFastestInterval(Constant.FASTINTERVAL);

        googleApiClient = new GoogleApiClient.Builder(this)
                .addApi(LocationServices.API)
                .addConnectionCallbacks(this)
                .addOnConnectionFailedListener(this)
                .build();
        if (googleApiClient != null) {
            googleApiClient.connect();
        }
    }

    @Override
    protected void onStart() {
        super.onStart();
        if (googleApiClient != null) {
            googleApiClient.connect();
        }
    }

    protected void onStop() {
        // Disconnecting the client invalidates it.
        if (googleApiClient != null) {
            googleApiClient.disconnect();
        }
        super.onStop();
    }


    @Override
    protected void onPause() {
        super.onPause();
        if (googleApiClient != null) {
            googleApiClient.disconnect();
        }
    }

    @Override
    protected void onResume() {
        super.onResume();
        if (manager.isProviderEnabled(LocationManager.GPS_PROVIDER)) {
            if (googleApiClient != null)
                googleApiClient.connect();
        }
    }

    @Override
    public void onConnected(@Nullable Bundle bundle) {
        if (googleApiClient.isConnected()) {
            Log.e(MainActivity.class.getSimpleName(), "Is connected");
        } else
            Log.e(MainActivity.class.getSimpleName(), "Is not connected");

        if (manager.isProviderEnabled(LocationManager.GPS_PROVIDER)) {
            Log.e(MainActivity.class.getSimpleName(), "Is connected on GPS");
        } else {
            Log.e(MainActivity.class.getSimpleName(), "Is not connected on GPS");
        }

        Utility.checkPermission(this);
        location = LocationServices.FusedLocationApi.getLastLocation(googleApiClient);

        if (location == null) {
            Utility.checkPermission(this);
            LocationServices.FusedLocationApi.requestLocationUpdates(googleApiClient, locationRequest, this);
        }

        if (location != null) {
            latText.setText("Lat: " + String.valueOf(location.getLatitude()));
            longText.setText("Long: " + String.valueOf(location.getLongitude()));
        } else {
            latText.setText(getString(R.string.error_find_location));
            longText.setText(getString(R.string.error_find_location));
        }
    }

    @Override
    public void onConnectionSuspended(int i) {

    }

    @Override
    public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {
        Log.e(MainActivity.class.getSimpleName(), connectionResult.toString());
    }

    @Override
    public void onLocationChanged(Location location) {
        currentLocation = location;
        if (googleApiClient != null)
            if (googleApiClient.isConnected() || googleApiClient.isConnecting()) {
                googleApiClient.disconnect();
                googleApiClient.connect();
            } else if (!googleApiClient.isConnected()) {
                googleApiClient.connect();
            }
        String msg = "Updated Location: " + Double.toString(location.getLatitude()) + "," + Double.toString(location.getLongitude());
        Toast.makeText(this, msg, Toast.LENGTH_SHORT).show();
        configureView();
    }

Upvotes: 2

Views: 464

Answers (1)

Thomas Fischer
Thomas Fischer

Reputation: 1514

My guess is that the last location only shows the last location. It doesn't actually try to figure out the location. On your phone another app probably requested the location. So, there is a last location.

I've added this code to request a location if there is none.

Location userLocation = LocationServices.FusedLocationApi.getLastLocation(googleApiClient);
if (userLocation == null) {
    LocationRequest locationRequest = new LocationRequest();
    locationRequest.setNumUpdates(1);
    locationRequest.setInterval(0);
    locationRequest.setPriority(PRIORITY_HIGH_ACCURACY);
    LocationServices.FusedLocationApi.requestLocationUpdates(
            googleApiClient, locationRequest,
            new LocationListener() {
                @Override
                public void onLocationChanged(Location location) {
                    LocationServices.FusedLocationApi.removeLocationUpdates(
                            googleApiClient,
                            this);
                }
            });

Upvotes: 3

Related Questions