Lancement de Google Maps Directions via une intention sur Android

Réponses:

630

Vous pouvez utiliser quelque chose comme ceci:

Intent intent = new Intent(android.content.Intent.ACTION_VIEW, 
    Uri.parse("http://maps.google.com/maps?saddr=20.344,34.34&daddr=20.5666,45.345"));
startActivity(intent);

Pour démarrer la navigation à partir de l'emplacement actuel, supprimez le saddrparamètre et la valeur.

Vous pouvez utiliser une adresse réelle au lieu de la latitude et de la longitude. Cependant, cela donnera à l'utilisateur une boîte de dialogue pour choisir entre l'ouvrir via un navigateur ou Google Maps.

Cela lancera directement Google Maps en mode navigation:

Intent intent = new Intent(android.content.Intent.ACTION_VIEW,
    Uri.parse("google.navigation:q=an+address+city"));

MISE À JOUR

En mai 2017, Google a lancé la nouvelle API pour les URL universelles et multiplateformes de Google Maps:

https://developers.google.com/maps/documentation/urls/guide

Vous pouvez également utiliser Intents avec la nouvelle API.

Jan S.
la source
2
Pas que je sache. Cependant, il n'y aura pas de dialogue si l'utilisateur a déjà choisi l'application par défaut pour ouvrir ce type d'intentions en tant qu'application de carte.
Jan S.
111
Si vous souhaitez vous débarrasser de la boîte de dialogue, vous pouvez donner à l'intention un indice sur le package que vous souhaitez utiliser. Avant le startActivity () ajoutez ceci: intent.setClassName("com.google.android.apps.maps", "com.google.android.maps.MapsActivity");
Jeremy Logan
et comment forger pour l'afficher sur le navigateur et non sur l'application googlemaps?
NullPointerException
68
Forcer l'utilisateur à une activité spécifique lorsqu'il peut avoir d'autres applications qu'il préfère semble contraire à l'esprit Android. Je serais tenté de laisser les filtres d'intention s'occuper des choses ici.
superluminaire
15
Les intentions de navigation semblent désormais officiellement prises en charge: developers.google.com/maps/documentation/android/…
Sanketh Katta du
124

C'est un peu hors sujet car vous avez demandé des "directions", mais vous pouvez également utiliser le schéma Geo URI décrit dans la documentation Android:

http://developer.android.com/guide/appendix/g-app-intents.html

Le problème avec "geo: latitude, longitude" est que Google Maps se centre uniquement sur votre point, sans épingle ni étiquette.

C'est assez déroutant, surtout si vous devez pointer vers un endroit précis ou / et demander des directions.

Si vous utilisez le paramètre de requête "geo: lat, lon? Q = nom" pour étiqueter votre géopoint, il utilise la requête pour la recherche et ignore les paramètres lat / lon.

J'ai trouvé un moyen de centrer la carte avec lat / lon et d'afficher une épingle avec une étiquette personnalisée, très agréable à afficher et utile pour demander des directions ou toute autre action:

Intent intent = new Intent(android.content.Intent.ACTION_VIEW, 
Uri.parse("geo:0,0?q=37.423156,-122.084917 (" + name + ")"));
startActivity(intent);

REMARQUE (par @TheNail): ne fonctionne pas dans Maps v.7 (dernière version au moment de la rédaction). Ignorera les coordonnées et recherchera un objet avec le nom donné entre les parenthèses. Voir aussi Intention pour Google Maps 7.0.0 avec emplacement

Murphy
la source
3
Bien, le geo par défaut: 0,0 déplace simplement la carte là-bas. Cette solution ["geo: 0,0? Q = 37.423156, -122.084917 (" + nom + ")"] vous permet de mettre votre propre nom de marqueur. Merci.
gnac
4
Fonctionne très bien - fyi ne semble pas fonctionner en conjonction avec le paramètre de requête "z" (niveau de zoom)
scolestock
1
Est-il possible de définir le mode de transit par défaut dans l'intention. Par défaut, l'option voiture est sélectionnée. Puis-je définir la marche comme mode par défaut?
Gardez
6
Pourquoi n'utilisez-vous pas geo:37.423156,-122.084917?q=37.423156,-122.084917 ...?
rekire
1
Assurez-vous d'urlEncode le paramètre label. J'ai eu des problèmes avec des caractères spéciaux comme l'espace.
Ethan
100

Bien que les réponses actuelles soient excellentes, aucune d'entre elles n'a fait tout à fait ce que je cherchais, je voulais ouvrir l'application de cartes uniquement, ajouter un nom pour chaque emplacement et destination source, en utilisant le schéma d'URI géo ne fonctionnerait pas pour moi du tout et le lien Web des cartes n'avait pas d'étiquettes, j'ai donc proposé cette solution, qui est essentiellement une fusion des autres solutions et commentaires faits ici, j'espère que cela sera utile pour les autres personnes qui consultent cette question.

String uri = String.format(Locale.ENGLISH, "http://maps.google.com/maps?saddr=%f,%f(%s)&daddr=%f,%f (%s)", sourceLatitude, sourceLongitude, "Home Sweet Home", destinationLatitude, destinationLongitude, "Where the party is at");
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(uri));
intent.setPackage("com.google.android.apps.maps");
startActivity(intent);

Pour utiliser votre position actuelle comme point de départ (malheureusement, je n'ai pas trouvé de moyen d'étiqueter la position actuelle), utilisez ce qui suit

String uri = String.format(Locale.ENGLISH, "http://maps.google.com/maps?daddr=%f,%f (%s)", destinationLatitude, destinationLongitude, "Where the party is at");
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(uri));
intent.setPackage("com.google.android.apps.maps");
startActivity(intent);

Pour être complet, si l'utilisateur n'a pas l'application de cartes installée, alors ce sera une bonne idée d'attraper l'ActivityNotFoundException, alors nous pouvons recommencer l'activité sans la restriction de l'application de cartes, nous pouvons être sûrs que nous n'obtiendrons jamais au Toast à la fin puisqu'un navigateur Internet est une application valide pour lancer ce schéma d'url aussi.

        String uri = String.format(Locale.ENGLISH, "http://maps.google.com/maps?daddr=%f,%f (%s)", 12f, 2f, "Where the party is at");
        Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(uri));
        intent.setPackage("com.google.android.apps.maps");
        try
        {
            startActivity(intent);
        }
        catch(ActivityNotFoundException ex)
        {
            try
            {
                Intent unrestrictedIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(uri));
                startActivity(unrestrictedIntent);
            }
            catch(ActivityNotFoundException innerEx)
            {
                Toast.makeText(this, "Please install a maps application", Toast.LENGTH_LONG).show();
            }
        }

PS Toutes les latitudes ou longitudes utilisées dans mon exemple ne sont pas représentatives de mon emplacement, toute ressemblance avec un emplacement réel est une pure coïncidence, alias je ne suis pas d'Afrique: P

ÉDITER:

Pour les directions, une intention de navigation est désormais prise en charge avec google.navigation

Uri navigationIntentUri = Uri.parse("google.navigation:q=" + 12f +"," + 2f);//creating intent with latlng
Intent mapIntent = new Intent(Intent.ACTION_VIEW, navigationIntentUri);
mapIntent.setPackage("com.google.android.apps.maps");
startActivity(mapIntent);
David Thompson
la source
2
C'est une excellente réponse David! Savez-vous également comment vraiment démarrer la navigation dans l'application de navigation? Dans son état actuel, l'utilisateur doit cliquer une dernière fois sur «Démarrer la navigation». J'ai recherché sur Google n'importe quel paramètre à passer, mais je n'en ai trouvé aucun.
Nirmal
Lorsque vous appuyez sur le bouton de retour de l'application Maps, un écran noir s'affiche et l'activité sous-jacente est recréée.Une idée comment résoudre ce problème?
Jas
@Jas supprime la méthode intent.setclassname
Ameen Maheen
salut, le code ci-dessus prend beaucoup de temps pour lancer l'application de carte par défaut dans les versions Android 4.4.2, 4.4.4 et 5.0.2. Son lancement fin en 5.1 et en version Marshmallow. Pourriez-vous s'il vous plaît aider à résoudre ce problème.
OnePunchMan
Je suggérerais maintenant d'utiliser intent.SetPackage au lieu de intent.setClassName ("com.google.android.apps.maps", "com.google.android.maps.MapsActivity"); Je mettrai à jour la réponse pour refléter cela.
David Thompson
22

Utilisation des dernières URL multiplateformes de Google Maps : même si l'application google maps est manquante, elle s'ouvrira dans le navigateur

Exemple https://www.google.com/maps/dir/?api=1&origin=81.23444,67.0000&destination=80.252059,13.060604

Uri.Builder builder = new Uri.Builder();
builder.scheme("https")
    .authority("www.google.com")
    .appendPath("maps")
    .appendPath("dir")
    .appendPath("")
    .appendQueryParameter("api", "1")
    .appendQueryParameter("destination", 80.00023 + "," + 13.0783);
String url = builder.build().toString();
Log.d("Directions", url);
Intent i = new Intent(Intent.ACTION_VIEW);
i.setData(Uri.parse(url));
startActivity(i);
lakshman sai
la source
10

Ouvrez Google Maps en utilisant Intent avec différents modes:

Nous pouvons ouvrir l'application Google Maps en utilisant l'intention:

val gmmIntentUri = Uri.parse("google.navigation:q="+destintationLatitude+","+destintationLongitude + "&mode=b")
val mapIntent = Intent(Intent.ACTION_VIEW, gmmIntentUri)
mapIntent.setPackage("com.google.android.apps.maps")
startActivity(mapIntent)

Ici, "mode = b" est pour le vélo.

Nous pouvons définir le mode de conduite, de marche et de vélo en utilisant:

  • d pour la conduite
  • w pour marcher
  • b pour faire du vélo

Vous pouvez en savoir plus sur l'intention avec google maps ici .

Remarque: S'il n'y a pas d'itinéraire pour le vélo / la voiture / la marche, il vous indiquera "Impossible de trouver le chemin"

Vous pouvez vérifier ma réponse originale ici .

SANAT
la source
8

Eh bien, vous pouvez essayer d'ouvrir l'application Android Maps intégrée en utilisant la Intent.setClassNameméthode.

Intent i = new Intent(Intent.ACTION_VIEW,Uri.parse("geo:37.827500,-122.481670"));
i.setClassName("com.google.android.apps.maps",
    "com.google.android.maps.MapsActivity");
startActivity(i);
Jonathan Caceres Romero
la source
6

Pour les points de cheminement multiples, les éléments suivants peuvent également être utilisés.

Intent intent = new Intent(android.content.Intent.ACTION_VIEW, 
    Uri.parse("https://www.google.com/maps/dir/48.8276261,2.3350114/48.8476794,2.340595/48.8550395,2.300022/48.8417122,2.3028844"));
startActivity(intent);

Le premier ensemble de coordonnées est votre emplacement de départ. Tous les points suivants sont des points de cheminement, l'itinéraire tracé passe.

Continuez simplement à ajouter des points de cheminement en concaténant "/ latitude, longitude" à la fin. Selon Google Documents, il y a apparemment une limite de 23 points de passage . Je ne sais pas si cela s'applique également à Android.

Adeel Tariq
la source
Qu'est-ce qui ne fonctionne pas? Que voyez-vous lors de l'exécution de ce code exact?
Adeel Tariq
En fait, n'utilisez pas les coordonnées exactes que j'ai mises ici. Ils sont au milieu de nulle part, sans route, donc ça ne marchera pas.
Adeel Tariq
4

Si vous souhaitez afficher la latitude et la longitude de la direction actuelle, vous pouvez utiliser ceci:

Les directions sont toujours données à partir de l'emplacement actuel de l'utilisateur.

La requête suivante vous aidera à effectuer cela. Vous pouvez transmettre la latitude et la longitude de destination ici:

google.navigation:q=latitude,longitude

Utilisez ci-dessus comme:

Uri gmmIntentUri = Uri.parse("google.navigation:q=latitude,longitude");
Intent mapIntent = new Intent(Intent.ACTION_VIEW, gmmIntentUri);
mapIntent.setPackage("com.google.android.apps.maps");
startActivity(mapIntent);

Ou si vous souhaitez afficher via l'emplacement, utilisez:

google.navigation:q=a+street+address

Plus d'informations ici: Google Maps Intents pour Android

WannaBeGeek
la source
pour les directions de travail, je devais ajoutermapIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
Quelqu'un Quelque part
4

Google DirectionsViewavec l'emplacement source comme emplacement actuel et l'emplacement de destination donné sous forme de chaîne

Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("http://maps.google.com/maps?f=d&daddr="+destinationCityName));
intent.setComponent(new ComponentName("com.google.android.apps.maps", "com.google.android.maps.MapsActivity"));
if (intent.resolveActivity(getPackageManager()) != null) {
    startActivity(intent);
}

Dans ce qui précède, destinationCityNameune chaîne variable peut être modifiée selon les besoins.

Ramesh kumar
la source
3

essaye ça

Intent intent = new Intent(android.content.Intent.ACTION_VIEW, Uri.parse("http://maps.google.com/maps?saddr="+src_lat+","+src_ltg+"&daddr="+des_lat+","+des_ltg));
intent.setClassName("com.google.android.apps.maps", "com.google.android.maps.MapsActivity");
startActivity(intent);
Vijay Web Solutions
la source
3

C'est ce qui a fonctionné pour moi:

Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse("http://maps.google.co.in/maps?q=" + yourAddress));
if (intent.resolveActivity(getPackageManager()) != null) {
   startActivity(intent);
}
JediCate
la source
1

si vous connaissez le point A, le point B (et toutes les fonctionnalités ou pistes intermédiaires), vous pouvez utiliser un fichier KML avec votre intention.

String kmlWebAddress = "http://www.afischer-online.de/sos/AFTrack/tracks/e1/01.24.Soltau2Wietzendorf.kml";
String uri = String.format(Locale.ENGLISH, "geo:0,0?q=%s",kmlWebAddress);
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(uri));
startActivity(intent);

pour plus d'informations, voir cette réponse SO

REMARQUE: cet exemple utilise un exemple de fichier qui (à partir de mar13) est toujours en ligne. s'il est hors ligne, recherchez un fichier kml en ligne et modifiez votre URL

Tony Gil
la source
1
Lorsque vous appuyez sur le bouton de retour de l'application Maps, un écran noir s'affiche et l'activité sous-jacente est recréée.Une idée comment résoudre ce problème?
Jas
@Jas, google a changé beaucoup de ses API et ce comportement a peut-être également changé. J'utilise des plans de rues ouverts exclusivement depuis un certain temps maintenant, donc je serais en mesure de vous aider. :)
tony gil
0

D'abord, vous devez maintenant que vous pouvez utiliser l'intention implicite, la documentation Android nous fournit des intentions communes très détaillées pour implémenter l'intention de la carte dont vous avez besoin pour créer une nouvelle intention avec deux paramètres

  • action
  • Uri

Pour l'action que nous pouvons utiliser Intent.ACTION_VIEW et pour Uri nous devons le construire, ci-dessous j'ai joint un exemple de code pour créer, construire, démarrer l'activité.

 String addressString = "1600 Amphitheatre Parkway, CA";

    /*
    Build the uri 
     */
    Uri.Builder builder = new Uri.Builder();
    builder.scheme("geo")
            .path("0,0")
            .query(addressString);
    Uri addressUri = builder.build();
    /*
    Intent to open the map
     */
    Intent intent = new Intent(Intent.ACTION_VIEW, addressUri);

    /*
    verify if the devise can launch the map intent
     */
    if (intent.resolveActivity(getPackageManager()) != null) {
       /*
       launch the intent
        */
        startActivity(intent);
    }
Bachiri Taoufiq Abderrahman
la source
1
L'utilisation d'Uri.Builder ne fonctionne que pour les URI absolus, sous la forme de:, <scheme>://<authority><absolute path>?<query>#<fragment>pas d'URI opaques <scheme>:<opaque part>#<fragment>. Le code ci-dessus donne l'URI suivant: geo:/0%2C0?Eiffel%20Towerce qui provoque le blocage de l'application Google Maps. Même la documentation officielle utilise des URI bruts / opaques pour cette raison. Le code correct serait alors:Uri.parse("geo:0,0?q=" + Uri.encode("Eiffel Tower"))
bitek
Voir également cette réponse pour une explication des raisons pour lesquelles votre réponse ne fonctionne pas: stackoverflow.com/a/12035226/313113
bitek
0

Une belle solution kotlin, utilisant la dernière réponse multiplateforme mentionnée par lakshman sai ...

Aucun Uri.toString inutile et Uri.parse cependant, cette réponse est claire et minimale:

 val intentUri = Uri.Builder().apply {
      scheme("https")
      authority("www.google.com")
      appendPath("maps")
      appendPath("dir")
      appendPath("")
      appendQueryParameter("api", "1")
      appendQueryParameter("destination", "${yourLocation.latitude},${yourLocation.longitude}")
 }.build()
 startActivity(Intent(Intent.ACTION_VIEW).apply {
      data = intentUri
 })
Vin Norman
la source
0

Vous pouvez lancer Google Maps Directions via une intention sur Android de cette façon

btn_search_route.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            String source = et_source.getText().toString();
            String destination = et_destination.getText().toString();

            if (TextUtils.isEmpty(source)) {
                et_source.setError("Enter Soruce point");
            } else if (TextUtils.isEmpty(destination)) {
                et_destination.setError("Enter Destination Point");
            } else {
                String sendstring="http://maps.google.com/maps?saddr=" +
                        source +
                        "&daddr=" +
                        destination;
                Intent intent = new Intent(android.content.Intent.ACTION_VIEW,
                        Uri.parse(sendstring));
                startActivity(intent);
            }
        }

    });
Jay patoliya
la source