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

2

5

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;
Cultigen answered 22/7, 2015 at 18:21 Comment(0)
K
6

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();
        }
    }

}
Keeper answered 22/7, 2015 at 19:51 Comment(4)
Where I can put getCurrentLocation() ?Schopenhauerism
@MuhammadShahzad This way of getting location is deprecated, if you want to get the current location for a map, take a look here: #30253623Keeper
Thank you, I'm unable to get current location in android studio, emulator 5554, I used geo fix xxx xxxx, all other possible ways but failed.Schopenhauerism
@MuhammadShahzad It sounds like you've seen this: #2280147 I would recommend using a real device for testing location based code.....Keeper
L
1

Why are you using

 private MapFragment map;

Your map should be of type

com.google.android.gms.maps.GoogleMap

Just change

private MapFragment map;

to

private GoogleMap map;

and get the map like the following:

map = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map))
                .getMap();

It will work fine.

Lukasz answered 22/7, 2015 at 18:35 Comment(5)
what´s the way to declarate google map? i was using map = (MapFragment) getFragmentManager().findFragmentById(R.id.map); to asign this but I change to Google map and give me an error because are different typesCultigen
@ReneLimon Updated the answer. Check the last line.Lukasz
one last question, getMap is not deprecated?Cultigen
@ReneLimon Yeah sorry, It's deprecated. Use getMapAsync() and onMapReady() returns the map object and It's guaranteed to be not null.Lukasz
@karthik actually, it can´t be onMapAsync because are diferent types I following Daniel Nugent stepsCultigen

© 2022 - 2024 — McMap. All rights reserved.