Search code examples
androidgoogle-mapsgoogle-maps-api-2

How to add Google Map Markers outside of onMapReady() in Android?


I have the following function that returns me the current location of device:

void getCurrentLocation()
{
    Location myLocation  = map.getMyLocation();
    if(myLocation!=null)
    {
        double dLatitude = myLocation.getLatitude();
        double dLongitude = myLocation.getLongitude();
        map.addMarker(new MarkerOptions().position(new LatLng(dLatitude, dLongitude))
                .title("My Location").icon(BitmapDescriptorFactory
                        .defaultMarker(BitmapDescriptorFactory.HUE_RED)));
        map.moveCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(dLatitude, dLongitude), 8));

    }
    else
    {
        Toast.makeText(this, "Unable to fetch the current location", Toast.LENGTH_SHORT).show();
    }
}

but some methods are showing in red like it were undefined: this

As you can notice, these methods are related with map, it work in onMapReady() function but out of it show it unrecognized. Why is that? What libraries I have to add? I declare map like this:

private MapFragment map;

Solution

  • Here is what your general code structure should look like. The important part is to assign your local map reference to the one returned in the onMapReady() callback.

    public class MainActivity extends Activity 
            implements OnMapReadyCallback {
    
        private GoogleMap map;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            MapFragment mapFragment = (MapFragment) getFragmentManager()
                    .findFragmentById(R.id.map);
    
            mapFragment.getMapAsync(this);
        }
    
        @Override
        public void onMapReady(GoogleMap retMap) {
    
            map = retMap;
    
            setUpMap();
    
        }
    
        public void setUpMap(){
    
            map.setMapType(GoogleMap.MAP_TYPE_HYBRID);
            map.setMyLocationEnabled(true);
        }
    
        void getCurrentLocation()
        {
            Location myLocation  = map.getMyLocation();
            if(myLocation!=null)
            {
                double dLatitude = myLocation.getLatitude();
                double dLongitude = myLocation.getLongitude();
                map.addMarker(new MarkerOptions().position(new LatLng(dLatitude, dLongitude))
                        .title("My Location").icon(BitmapDescriptorFactory
                                .defaultMarker(BitmapDescriptorFactory.HUE_RED)));
                map.moveCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(dLatitude, dLongitude), 8));
    
            }
            else
            {
                Toast.makeText(this, "Unable to fetch the current location", Toast.LENGTH_SHORT).show();
            }
        }
    
    }