web-dev-qa-db-fra.com

Lancer Google Maps Directions via une intention sur Android

Mon application doit afficher les itinéraires de Google Maps de A à B, mais je ne souhaite pas intégrer Google Maps à mon application. Je souhaite plutôt le lancer à l'aide d'une intention. Est-ce possible? Si oui comment?

375
Lars D

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 paramètre saddr et sa 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 va directement lancer Google Maps en mode navigation:

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

UPDATE

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

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

Vous pouvez également utiliser Intents avec la nouvelle API.

602
Jan S.

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

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

Le problème avec "géo: latitude, longitude" est que Google Maps est uniquement centré sur votre point, sans aucune épingle ni étiquette.

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

Si vous utilisez le paramètre de requête "geo: lat, lon? Q = name" 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 (version la plus récente au moment de la rédaction). Ignorer les coordonnées et rechercher un objet avec le nom donné entre les parenthèses. Voir aussi Intention pour Google Maps 7.0.0 avec emplacement

118
Murphy

Bien que les réponses actuelles soient excellentes, aucune d’entre elles n’a fait ce que je recherchais, mais je voulais ouvrir uniquement l’application pour cartes, ajouter un nom pour chaque emplacement et destination source, utiliser le système de géo-URI ne me conviendrait pas. du tout et le lien Web des cartes n’ayant pas d’étiquettes, j’ai proposé cette solution, qui consiste essentiellement en une fusion des autres solutions et commentaires formulés ici. J'espère que cela aidera les autres lecteurs de 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é le moyen de donner une étiquette à la position actuelle), utilisez ensuite le code suivant:

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 installé l’application de cartes, il sera judicieux d’attraper l’ActivityNotFoundException. Nous pouvons alors relancer l’activité sans restriction de l’application de cartes. 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();
            }
        }

P.S. Les latitudes ou longitudes utilisées dans mon exemple ne sont pas représentatives de ma position, toute ressemblance avec une position réelle est une pure coïncidence, autrement dit je ne suis pas d'Afrique: P

EDIT:

Pour les itinéraires, une intention de navigation est maintenant 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);
95
David Thompson
Uri.Builder directionsBuilder = new Uri.Builder()
        .scheme("https")
        .authority("www.google.com")
        .appendPath("maps")
        .appendPath("dir")
        .appendPath("")
        .appendQueryParameter("api", "1")
        .appendQueryParameter("destination", lat + "," + lon);

startActivity(new Intent(Intent.ACTION_VIEW, directionsBuilder.build()));
29
Igor Bubelov

Utilisation des dernières URL multi-plateformes 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);
17
lakshman sai

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

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

Vous pouvez également utiliser les points suivants pour les points de passage multiples.

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

Premier ensemble de coordonnées sont votre emplacement de départ. Tous les points suivants sont des points de passage, la route tracée passe par.

Continuez simplement à ajouter des points de cheminement en concassant "/ latitude, longitude" à la fin. Il y a apparemment une limite de 23 points de chemin selon google docs . Vous ne savez pas trop si cela s'applique à Android.

5
Adeel Tariq

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

Les directions sont toujours données à partir de la position actuelle des utilisateurs.

La requête suivante vous aidera à effectuer cela. Vous pouvez indiquer la latitude et la longitude de la 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 voulez montrer via l'emplacement, utilisez:

google.navigation:q=a+street+address

Plus d'informations ici: Intentions Google Maps pour Android

4
WannaBeGeek

Google DirectionsView avec l'emplacement source en tant qu'emplacement actuel et l'emplacement de destination 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, destinationCityName est une chaîne de caractères qui l’a modifiée selon les besoins.

4
Ramesh kumar

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);
}
3
JediCate

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 les modes conduite, marche et vélo en utilisant:

  • d pour conduire
  • w pour marcher
  • b pour faire du vélo

Vous pouvez en savoir plus sur l'intention avec Google Maps here .

Remarque: S'il n'y a pas de route pour le vélo/la voiture/la marche, le message "Vous ne trouvez pas le chemin"

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

3
SANAT

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);
2
Vijay Web Solutions

si vous connaissez le point A, le point B (et les fonctions 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 this SO answer

NOTE: cet exemple utilise un exemple de fichier qui (depuis le 13 mars) est toujours en ligne. s'il est hors ligne, trouvez un fichier kml en ligne et modifiez votre URL

1
tony gil

Tout d’abord, vous devez maintenant pouvoir utiliser l’intention implicite. Android la documentation nous fournit un très détaillé intentions communes pour la mise en oeuvre de l’intention de la carte, vous devez créer une nouvelle intention avec deux paramètres

  • Action
  • Uri

Pour l’action, nous pouvons utiliser Intent.ACTION_VIEW et pour Uri, nous devrions le construire. Ci-dessous, je joins 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);
    }