Search code examples
javaandroidgoogle-api-clientlocationlistener

Trying to get current location through onConnected() method


I'm trying to get my current location through the onConnected() method. But unfortunately onMapReady() gets called earlier. Because of that my variables currentLatitude and currentLongitude contains the value 0.0 as you can see in the logs below:

I/System.out: currentLatitude : 0.0
I/System.out: currentLongitude : 0.0
D/: HostConnection::get() New Host Connection established 0xeec39820, tid 23599
I/System.out: onConnected

I had already tried to use AsyncTask but that doesn't work because onPreExecute() gets executed before the onConnected(). Here you can see a screenshot of it:

Link: https://i.sstatic.net/kU9sK.png

Here below you can see my code:

public class BreakDownOnMaps extends FragmentActivity implements
        GoogleApiClient.ConnectionCallbacks,
        GoogleApiClient.OnConnectionFailedListener,
        LocationListener,
        OnMapReadyCallback {
    protected GoogleApiClient mGoogleApiClient;
    private LocationRequest mLocationRequest =  new LocationRequest();
    double currentLatitude;
    double currentLongitude;
    LatLng latLng;

    @TargetApi(Build.VERSION_CODES.M)
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_break_down_on_maps);
        buildApi();
        SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
                .findFragmentById(R.id.map);
        mapFragment.getMapAsync(this);
    }

    @Override
    protected void onStart() {
        super.onStart();
        mGoogleApiClient.connect();
    }

    @Override
    protected void onResume() {
        super.onResume();
        mGoogleApiClient.connect();
    }

    private void buildApi() {
        mGoogleApiClient = new GoogleApiClient.Builder(this)
                .addConnectionCallbacks(this)
                .addOnConnectionFailedListener(this)
                .addApi(LocationServices.API)
                .build();
    }

    public void handleNewLocation(Location loc) {
        currentLatitude = loc.getLatitude();
        currentLongitude = loc.getLongitude();
        latLng = new LatLng(currentLatitude, currentLongitude);
        System.out.println("handleNewLocation ");
    }

    @Override
    public void onConnected(Bundle bundle) {
        System.out.println("onConnected");
        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED
                && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
        }
        Location location = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient);
        if (location == null) {
            LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, (com.google.android.gms.location.LocationListener) this);
        }
        else {
            handleNewLocation(location);
        }
    }

    @Override
    public void onMapReady(GoogleMap googleMap) {
        System.out.println("currentLatitude : " + currentLatitude);
        System.out.println("currentLongitude : " + currentLongitude);
        latLng = new LatLng(currentLatitude, currentLongitude);
        MarkerOptions options = new MarkerOptions()
                .position(latLng)
                .title("I am here!");
        googleMap.addMarker(options);
        googleMap.moveCamera(CameraUpdateFactory.newLatLng(latLng));
    }

Solution

  • I have fixed it by using a a setter method for my global GoogleMapvariable called gMap. Inside the handleNewLocation() I'm using the variable gMap to pinpoint where I am through using a marker.

    Here is the full code:

    public class BreakDownOnMaps extends FragmentActivity implements
            GoogleApiClient.ConnectionCallbacks,
            GoogleApiClient.OnConnectionFailedListener,
            LocationListener,
            OnMapReadyCallback {
        protected GoogleApiClient mGoogleApiClient;
        private LocationRequest mLocationRequest =  new LocationRequest();
        double currentLatitude;
        double currentLongitude;
        LatLng latLng;
        GoogleMap gMap;
    
    
        @TargetApi(Build.VERSION_CODES.M)
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_break_down_on_maps);
            buildApi();
            SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
                    .findFragmentById(R.id.map);
            mapFragment.getMapAsync(this);
        }
    
        @Override
        protected void onStart() {
            super.onStart();
            mGoogleApiClient.connect();
        }
        @Override
        protected void onResume() {
            super.onResume();
            mGoogleApiClient.connect();
        }
    
        private void buildApi() {
            mGoogleApiClient = new GoogleApiClient.Builder(this)
                    .addConnectionCallbacks(this)
                    .addOnConnectionFailedListener(this)
                    .addApi(LocationServices.API)
                    .build();
        }
    
        public void handleNewLocation(Location loc) {
            currentLatitude = loc.getLatitude();
            currentLongitude = loc.getLongitude();
            latLng = new LatLng(currentLatitude, currentLongitude);
            System.out.println("handleNewLocation ");
            MarkerOptions options = new MarkerOptions()
                    .position(latLng)
                    .title("I am here!");
            gMap.addMarker(options);
            gMap.moveCamera(CameraUpdateFactory.newLatLng(latLng));
        }
    
        @Override
        public void onConnected(Bundle bundle) {
            System.out.println("onConnected");
            if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED
                    && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
            }
            Location location = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient);
            if (location == null) {
                LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, (com.google.android.gms.location.LocationListener) this);
            }
            else {
                handleNewLocation(location);
            };
        }
    
        @Override
        public void onConnectionSuspended(int i) {}
    
        @Override
        public void onLocationChanged(Location location) {
            handleNewLocation(location);
        }
    
        @Override
        public void onConnectionFailed(ConnectionResult connectionResult) {}
    
        @Override
        public void onMapReady(GoogleMap googleMap) {
            System.out.println("currentLatitude : " + currentLatitude);
            System.out.println("currentLongitude : " + currentLongitude);
            latLng = new LatLng(currentLatitude, currentLongitude);
            setgMap(googleMap);
            if(currentLatitude != 0 || currentLongitude != 0) {
                MarkerOptions options = new MarkerOptions()
                        .position(latLng)
                        .title("I am here!");
                googleMap.addMarker(options);
                googleMap.moveCamera(CameraUpdateFactory.newLatLng(latLng));
            }
        }
    
        public GoogleMap getgMap() {
            return gMap;
        }
    
        public void setgMap(GoogleMap gMap) {
            this.gMap = gMap;
        }
    }