149 votes

Comment ouvrir l'application Google Map standard depuis mon application?

Une fois que l'utilisateur appuie sur le bouton de mon application, je voudrais ouvrir l'application Google Map standard et afficher un emplacement particulier. Comment puis-je le faire? (sans utiliser com.google.android.maps.MapView)

255voto

Michael Points 16659

Vous devriez créer un objet Intent avec un geo-URI :

String uri = String.format(Locale.ENGLISH, "geo:%f,%f", latitude, longitude);
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(uri));
context.startActivity(intent);

Si vous souhaitez spécifier une adresse, vous devriez utiliser une autre forme de geo-URI : geo:0,0?q=adresse.

référence : https://developer.android.com/guide/components/intents-common.html#Maps

1 votes

Merci, @Pixie! Quel est le format de latitude et de longitude? Si je passe lat: 59.915494, lng: 30.409456, cela renvoie une mauvaise position.

0 votes

Le URI doit être : geo:59.915494,30.409456. Vous pouvez le vérifier en utilisant maps.google.com. Il vous suffit d'entrer 59.915494,30.409456 et vous obtiendrez le bon endroit. Google dit que c'est sur un pont à Saint-Pétersbourg, en Russie.

0 votes

@Pixie, merci - c'est exactement ce que j'ai fait. maps.google.com montre l'emplacement correct, mais quand la même URI est utilisée dans l'application Android, elle montre un endroit différent.

113voto

David Thompson Points 887

Vous pouvez également simplement utiliser http://maps.google.com/maps comme URI

String uri = "http://maps.google.com/maps?saddr=" + sourceLatitude + "," + sourceLongitude + "&daddr=" + destinationLatitude + "," + destinationLongitude;
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(uri));
startActivity(intent);

ou vous pouvez vous assurer que seule l'application Google Maps est utilisée, cela empêche le filtre d'intent (dialogue) de s'afficher, en utilisant

intent.setPackage("com.google.android.apps.maps");

comme ceci:

String uri = "http://maps.google.com/maps?saddr=" + sourceLatitude + "," + sourceLongitude + "&daddr=" + destinationLatitude + "," + destinationLongitude;
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(uri));
intent.setPackage("com.google.android.apps.maps");
startActivity(intent);

ou vous pouvez ajouter des libellés aux emplacements en ajoutant une chaîne entre parenthèses après chaque jeu de coordonnées comme ceci:

String uri = "http://maps.google.com/maps?saddr=" + sourceLatitude + "," + sourceLongitude + "(" + "Home Sweet Home" + ")&daddr=" + 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 l'emplacement actuel de l'utilisateur comme point de départ (malheureusement je n'ai pas trouvé de moyen d'étiqueter l'emplacement actuel) alors il suffit de supprimer le paramètre saddr comme suit:

String uri = "http://maps.google.com/maps?daddr=" + 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 plus de complétude, si l'utilisateur n'a pas l'application de cartes installée, il sera judicieux de capturer l'ActivityNotFoundException, comme le mentionne @TonyQ, alors nous pouvons démarrer l'activité à nouveau sans la restriction de l'application de cartes, nous pouvons être assez sûrs que nous n'arriverons jamais au Toast à la fin car un navigateur internet est une application valide pour lancer ce schéma d'URL aussi.

        String uri = "http://maps.google.com/maps?daddr=" + 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();
            }
        }

ÉDITER:

Pour les directions, un intent de navigation est désormais pris en charge avec google.navigation

Uri navigationIntentUri = Uri.parse("google.navigation:q=" + 12f + "," + 2f);
Intent mapIntent = new Intent(Intent.ACTION_VIEW, navigationIntentUri);
mapIntent.setPackage("com.google.android.apps.maps");
startActivity(mapIntent);

0 votes

Java.util.IllegalFormatConversionException: %f ne peut pas formater les exceptions d'arguments java.lang.String

0 votes

Veuillez poster ce que vous avez remplacé par la première ligne de code [la ligne qui commence par String uri = string.format]. Il semble que vous ayez une chaîne de caractères comme l'un des paramètres qui devrait être un flottant.

0 votes

Salut, lorsque je passe une étiquette à Google Maps avec la latitude et la longitude, l'application de carte convertit l'étiquette en adresses. Pouvez-vous me dire comment résoudre ce problème?

43voto

David Wiesner Points 431

En utilisant le format String cela aidera mais vous devez faire attention à la locale. En Allemagne, les nombres décimaux seront séparés par des virgules au lieu des points.

En utilisant String.format("geo:%f,%f",5.1,2.1); avec la locale anglaise, le résultat sera "geo:5.1,2.1" mais avec la locale allemande, vous obtiendrez "geo:5,1,2,1"

Vous devriez utiliser la locale anglaise pour éviter ce comportement.

String uri = String.format(Locale.ENGLISH, "geo:%f,%f", latitude, longitude);
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(uri));
context.startActivity(intent);

Pour définir une étiquette pour le point géographique, vous pouvez étendre votre uri geo en utilisant :

!!! mais soyez prudent avec cela, l'uri geo est encore en développement https://datatracker.ietf.org/doc/html/draft-mayrhofer-geo-uri-00

String uri = String.format(Locale.ENGLISH, "geo:%f,%f?z=%d&q=%f,%f (%s)", 
                           latitude, longitude, zoom, latitude, longitude, label);
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(uri));
context.startActivity(intent);

0 votes

Vous pouvez également utiliser "&t=h" au lieu de "&t=m" pour appeler l'affichage en mode satellite ou carte.

1 votes

Je teste quelque chose de similaire sauf que j'ajoute une requête avec les coordonnées pour obtenir un ballon. Mon code ressemble exactement à ton premier exemple. Je formate l'URI avec l'anglais locale, mais lorsque je l'utilise sur mon appareil réglé sur un locale allemand, Google Maps remplace toujours les points par des virgules donc ma requête ne fonctionne pas. Lorsque je règle le locale de l'appareil sur l'anglais US par exemple, ça marche parfaitement bien. Que puis-je faire ? Il semble qu'importe ce que je fais, Google Maps modifie de nouveau la chaîne de requête.

9voto

Snicolas Points 19644

Vérifiez cette page de google :

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

Vous pouvez utiliser une URI de la forme

geo:latitude,longitude

pour ouvrir le visualiseur de cartes Google et le pointer vers un emplacement.

6voto

TonyQ Points 499

Parfois, s'il n'y a aucune application associée au protocole geo:, vous pouvez utiliser try-catch pour obtenir l'ActivityNotFoundException afin de le gérer.

Cela se produit lorsque vous utilisez certains émulateurs comme androVM qui n'ont pas Google Maps installé par défaut.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X