Comment ajouter un marqueur sur les cartes dans la programmation Android

Donc, pour une raison quelconque, lorsque j'essaie d'ajouter un marqueur à un géopoint, le marqueur ne s'affiche pas à l'emplacement donné. J'ai essayé de rechercher ce qui pourrait être le problème, mais pour une raison quelconque, mon code semble suivre tout ce que j'ai recherché. Quelqu'un peut-il me guider dans la bonne direction?

import android.content.Context;
import android.location.Criteria;
import android.location.Geocoder;
import android.location.Location;
import android.location.LocationManager;
import android.support.v4.app.FragmentActivity;
import android.os.Bundle;
import android.util.Log;
import android.widget.Toast;
import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.SupportMapFragment;
import com.google.android.gms.maps.model.CameraPosition;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.MarkerOptions;

import java.text.DecimalFormat;

public class MapsActivity extends FragmentActivity {

private GoogleMap mMap;//Might be null if Google Play services APK is not available.

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_maps);
    setUpMapIfNeeded();
}

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

/**
 * Sets up the map if it is possible to do so (i.e., the Google Play services APK is correctly
 * installed) and the map has not already been instantiated.. This will ensure that we only ever
 * call {@link #setUpMap()} once when {@link #mMap} is not null.
 * 
 * If it isn't installed {@link SupportMapFragment} (and
 * {@link com.google.android.gms.maps.MapView MapView}) will show a prompt for the user to
 * install/update the Google Play services APK on their device.
 * 
 * A user can return to this FragmentActivity after following the prompt and correctly
 * installing/updating/enabling the Google Play services. Since the FragmentActivity may not
 * have been completely destroyed during this process (it is likely that it would only be
 * stopped or paused), {@link #onCreate(Bundle)} may not be called again so we should call this
 * method in {@link #onResume()} to guarantee that it will be called.
 */
private void setUpMapIfNeeded() {
   //Do a null check to confirm that we have not already instantiated the map.
    if (mMap == null) {
       //Try to obtain the map from the SupportMapFragment.
        mMap = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map))
                .getMap();
       //Check if we were successful in obtaining the map.
        if (mMap != null) {
            setUpMap();
        }
    }
}

/**
 * This is where we can add markers or lines, add listeners or move the camera. In this case, we
 * just add a marker near Africa.
 * 
 * This should only be called once and when we are sure that {@link #mMap} is not null.
 */

private void setUpMap() {

    mMap.addMarker(new MarkerOptions().position(new LatLng(0, 0)).title("Marker").snippet("Snippet"));

   //Enable MyLocation Layer of Google Map
    mMap.setMyLocationEnabled(true);

   //Get LocationManager object from System Service LOCATION_SERVICE
    LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);

   //Create a criteria object to retrieve provider
    Criteria criteria = new Criteria();

   //Get the name of the best provider
    String provider = locationManager.getBestProvider(criteria, true);

   //Get Current Location
    Location myLocation = locationManager.getLastKnownLocation(provider);

   //set map type
    mMap.setMapType(GoogleMap.MAP_TYPE_NORMAL);

   //Get latitude of the current location

    Location location = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);

    if (location != null) {
        double longitude = location.getLongitude();
        double latitude = location.getLatitude();


       //Get longitude of the current location

       //Create a LatLng object for the current location
        LatLng latLng = new LatLng(latitude, longitude);

       //Show the current location in Google Map
        mMap.moveCamera(CameraUpdateFactory.newLatLng(latLng));

       //Zoom in the Google Map
        //LatLng myCoordinates = new LatLng(latitude, longitude);
        //CameraUpdate yourLocation = CameraUpdateFactory.newLatLngZoom(myCoordinates, 20);
        //mMap.animateCamera(yourLocation);
        mMap.animateCamera(CameraUpdateFactory.zoomTo(20));
        mMap.addMarker(new MarkerOptions().position(new LatLng(latitude, longitude)).title("You are here!").snippet("Consider yourself located"));


        LatLng toLatLng = new LatLng(40.6937, 73.9859);

        mMap.addMarker(new MarkerOptions().position( new LatLng(40.6937, 73.9859)).title("You location is here!").snippet("Consider it located"));

    }
}



        public void onFinish() {
           //Your code here to do something after the Map is rendered
        }
    }
0
Quel est le comportement incorrect que vous obtenez?
ajouté l'auteur nasch, source
Obtenez-vous l'emplacement (emplacement! = Null)?
ajouté l'auteur zgc7009, source
Êtes-vous à Brooklyn NY ou au Kirghizistan?
ajouté l'auteur Daniel Nugent, source
@LexMars Nice, je viens de rentrer d'un voyage en Oregon. Est-ce que le seul problème que vous avez avec le marqueur à l'équateur près de l'Afrique? Cela est simplement dû à cette ligne: mMap.addMarker (new MarkerOptions (). Position (nouveau LatLng (0, 0)). Title ("Marker"). Snippet ("Snippet"));
ajouté l'auteur Daniel Nugent, source

1 Réponses

Le principal problème que vous mentionnez:

le marqueur ne se présente pas à l'emplacement donné

Il semble que la principale raison est que le getLastKnownLocation() renvoie null, donc il ne pénètre jamais dans votre code qui définit le marqueur à la position actuelle.

Au lieu d'appeler cette méthode, vous pouvez configurer un écouteur d'emplacement, qui demandera explicitement un nouvel emplacement.

J'ai nettoyé un peu votre code et je l'ai fait fonctionner. Notez que j'ai supprimé l'utilisation de getLastKnownLocation() et déplacé la logique que vous aviez dans le rappel onLocationChanged() .

J'ai également ajouté des fonctionnalités pour supprimer l'ancien marqueur "Emplacement actuel" et en ajouter un nouveau chaque fois que l'emplacement change.

Notez également que le marqueur qui se trouvait à l'équateur près de l'Afrique était dû à cette ligne, donc je viens de le commenter:

mMap.addMarker(new MarkerOptions().position(new LatLng(0, 0)).title("Marker").snippet("Snippet"));

Voici le code de classe complet mis à jour:

import android.content.Context;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.support.v4.app.FragmentActivity;
import android.os.Bundle;
import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.SupportMapFragment;
import com.google.android.gms.maps.model.BitmapDescriptorFactory;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.Marker;
import com.google.android.gms.maps.model.MarkerOptions;
import android.location.Criteria;

public class MapsActivity extends FragmentActivity implements LocationListener {

    private GoogleMap mMap;//Might be null if Google Play services APK is not available.
    LocationManager locationManager;
    Marker marker;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_maps);
        setUpMapIfNeeded();
    }

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

    @Override
    protected void onPause() {
        super.onPause();

        //remove location listener
        if (locationManager != null){
            locationManager.removeUpdates(this);
        }

    }

    private void setUpMapIfNeeded() {
       //Do a null check to confirm that we have not already instantiated the map.
        if (mMap == null) {
           //Try to obtain the map from the SupportMapFragment.
            mMap = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map))
                    .getMap();
           //Check if we were successful in obtaining the map.
            if (mMap != null) {
                setUpMap();
            }
        }
    }

    private void setUpMap() {

        //This was the Marker at equator near Africa
        //mMap.addMarker(new MarkerOptions().position(new LatLng(0, 0)).title("Marker").snippet("Snippet"));

       //Enable MyLocation Layer of Google Map
        mMap.setMyLocationEnabled(true);
        mMap.setMapType(GoogleMap.MAP_TYPE_HYBRID);
        mMap.getUiSettings().setZoomControlsEnabled(true);
        mMap.getUiSettings().setMyLocationButtonEnabled(true);
        mMap.getUiSettings().setCompassEnabled(true);
        mMap.getUiSettings().setRotateGesturesEnabled(true);
        mMap.getUiSettings().setZoomGesturesEnabled(true);

       //Get LocationManager object from System Service LOCATION_SERVICE
        locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);

        if (locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER)) {
            locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 1000, 0, this);
        }

        if (locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) {
            locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000, 0, this);
        }


    }



    public void onFinish() {
       //Your code here to do something after the Map is rendered
    }

    @Override
    public void onLocationChanged(Location location) {

        double longitude = location.getLongitude();
        double latitude = location.getLatitude();

       //Create a LatLng object for the current location
        LatLng latLng = new LatLng(latitude, longitude);

       //Show the current location in Google Map
        mMap.moveCamera(CameraUpdateFactory.newLatLng(latLng));
        mMap.animateCamera(CameraUpdateFactory.zoomTo(15));

        if (marker != null) {
            marker.remove();
        }
        marker = mMap.addMarker(new MarkerOptions().position(new LatLng(latitude, longitude))
                .title("You are here!").snippet("Consider yourself located")
                .icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_MAGENTA)));

    }

    @Override
    public void onStatusChanged(String provider, int status, Bundle extras) {

    }

    @Override
    public void onProviderEnabled(String provider) {

    }

    @Override
    public void onProviderDisabled(String provider) {

    }
}

Résultat:

Map Image

Modifier:

Vous avez choisi un endroit intéressant pour mettre votre Marker codé en dur.

J'ai remplacé le code du marqueur par ceci:

    LatLng toLatLng = new LatLng(40.6937, 73.9859);

   //Create a LatLng object for the current location
    LatLng latLng = new LatLng(40.6937, 73.9859);

   //Show the current location in Google Map
    mMap.moveCamera(CameraUpdateFactory.newLatLng(latLng));
    mMap.animateCamera(CameraUpdateFactory.zoomTo(15));

    if (marker != null) {
        marker.remove();
    }
    marker = mMap.addMarker(new MarkerOptions().position(new LatLng(40.6937, 73.9859))
            .title("You are here!").snippet("Consider yourself located")
            .icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_MAGENTA)));

Et il a placé le marqueur à l'endroit donné. Notez qu'il y a un effet étrange en raison de différentes images satellites.

Initial Résultat:

initial

Zoom arrière pour voir où nous sommes!

zoomed out

0
ajouté
@LexMars Oui, définitivement. J'ai enlevé les géo-points de code dur bien. Vous pouvez ajouter tous ceux que vous voulez codés en dur, ils devraient apparaître. Je pense que c'était juste la valeur nulle pour l'emplacement qui empêchait votre code d'entrer dans le code qui place les marqueurs.
ajouté l'auteur Daniel Nugent, source
@LexMars Je vais ajouter quelques points codés en dur et l'ajouter à la réponse.
ajouté l'auteur Daniel Nugent, source
@LexMars s'assure que vous ajoutez marqueur marqueur; comme une variable d'instance, et assurez-vous que vous avez l'appel de marker.remove (); pour vous assurer que vous n'avez pas obtenir des marqueurs en double pour chaque emplacement modifié callback. Pour l'emplacement de l'itinéraire, consultez l'API Google Directions.
ajouté l'auteur Daniel Nugent, source
ajouté l'auteur Daniel Nugent, source