2010-04-18 12 views

Répondre

520

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 la valeur.

Vous pouvez utiliser une adresse municipale 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 ouvrira Google Maps en mode de navigation directement:

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 cross-plate-forme universelle, URL Google Maps:

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

Vous pouvez également utiliser Intents avec la nouvelle API.

+9

Y at-il de toute façon pour supprimer le dialogue ??? et que ce soit juste l'application de carte – molleman

+2

Pas que je sois conscient de. Cependant, il n'y aura pas de boîte de dialogue si l'utilisateur a déjà choisi l'application par défaut pour ouvrir ce type d'intentions pour être l'application cartographique. –

+103

Si vous voulez vous débarrasser de la boîte de dialogue, vous pouvez indiquer à l'intention quel paquet vous voulez utiliser. Avant le startActivity() ajoutez ceci: 'intent.setClassName (" com.google.android.apps.maps "," com.google.android.maps.MapsActivity ");' –

110

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

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

Le problème en utilisant « geo: latitude , longitude "est que Google Maps n'est centré que sur votre point, sans pin ni étiquette.

C'est assez déroutant, surtout si vous avez besoin de pointer vers un endroit précis et/ou demander des indications.

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

J'ai trouvé un moyen de centrer la carte avec la latitude/longitude et afficher une broche 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); 

NOTE (par @TheNail): Ne fonctionne pas dans Maps v.7 (dernière version au moment de l'écriture). Ignorera les coordonnées et recherchera un objet avec le nom donné entre les parenthèses. Voir aussi Intent for Google Maps 7.0.0 with location

+3

Nice, le géo par défaut: 0,0 ne fait que déplacer la carte là-bas Cette solution ["geo: 0,0? q = 37.423156, -122.084917 (" + name + ")"] vous permet de mettre votre propre nom de marqueur Merci – gnac

+0

ci-dessus fonctionne également avec Uri.parse ("geo: 0,0? q = personnalisé + adresse (" + nom + ")") Exactl y ce que je veux voulait. Merci. – anargund

+3

Fonctionne bien - fyi ne semble pas fonctionner en conjonction avec le paramètre de requête "z" (niveau de zoom) – scolestock

0

Si vous connaissez le point A, le point B (ainsi que les caractéristiques ou les 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, consultez this SO answer

REMARQUE: cet exemple utilise un fichier exemple (en mar13) est toujours en ligne.si elle est déconnectée, trouver un fichier kml en ligne et changer votre url

+1

Lorsque vous appuyez sur le bouton de retour à partir de l'application maps, un écran noir s'affiche et l'activité sous-jacente est recréée.Avez-vous une idée pour résoudre ce problème? – Jas

+0

@Jas, google a changé beaucoup de ses API et ce comportement a peut-être changé aussi. J'utilise exclusivement des cartes ouvertes depuis un certain temps maintenant, donc je serais en mesure de vous aider. :) –

77

Bien que les réponses actuelles soient excellentes, aucune d'entre elles n'a fait ce que je cherchais, je voulais ouvrir l'application de cartes seulement, ajouter un nom pour chaque emplacement source et destination, en utilisant le schéma de géo URI ne fonctionnerait pas du tout pour moi et le lien web des cartes n'avait pas d'étiquettes donc je suis venu avec cette solution, qui est essentiellement une fusion des autres solutions et commentaires fait ici, j'espère que c'est utile pour les autres qui regardent 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 ne l'ai pas trouvé un moyen d'étiqueter l'emplacement actuel) puis utilisez les éléments suivants

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 » Si l'application maps est installée, alors il sera judicieux d'attraper ActivityNotFoundException, puis nous pourrons recommencer l'activité sans la restriction de l'application maps, nous pouvons être sûrs que nous n'obtiendrons jamais le Toast à la fin, car 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. Toutes les latitudes ou longitudes utilisées dans mon exemple ne sont pas représentatifs de mon emplacement, toute ressemblance avec un véritable emplacement est un pur hasard, alias Je ne suis pas d'Afrique: P

EDIT:

Pour les directions, une intention 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); 
+2

Ceci est une excellente réponse David! Savez-vous également comment vraiment commencer la navigation à l'intérieur de l'application de navigation? Dans son état actuel, l'utilisateur doit cliquer sur 'Démarrer la navigation' une dernière fois. J'ai cherché Google pour tout paramètre à passer, mais je n'en ai trouvé aucun. – Nirmal

+0

pouvons-nous ajouter la fenêtre d'information de marqueur sur son sur clic? –

+0

Lorsque vous appuyez sur le bouton de retour à partir de l'application maps, un écran noir s'affiche et l'activité sous-jacente est recréée.Avez-vous une idée de comment résoudre ce problème? – Jas

2

essayer

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

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

D'abord, vous devez maintenant que vous pouvez utiliser l'intention implicite, la documentation android nous fournir une très détaillée common intents pour mettre en œuvre l'intention de carte, vous devez créer une nouvelle intention avec deux paramètres

  • action
  • Uri

Pour une action que nous pouvons utiliser Intent.ACTION_VIEW et pour Uri nous devrions 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); 
    } 
+0

L'utilisation d'Uri.Builder ne fonctionne que pour les URI absolus, sous la forme de:' : // ? # ', URI non opaques' : # '. Le code ci-dessus génère l'URI suivant: 'geo:/0% 2C0? Eiffel% 20Tower', ce qui provoque le blocage de l'application Google Maps. Même [la documentation officielle] (https://developers.google.com/maps/documentation/android-api/intents) utilise des URI brutes/opaques pour cette raison. Le code correct serait alors: 'Uri.parse (" geo: 0,0? Q = "+ Uri.encode (" Tour Eiffel "))' – bitek

+0

Voir aussi cette réponse pour une explication de pourquoi votre réponse ne fonctionne pas : http://stackoverflow.com/a/12035226/313113 – bitek

2

Pour les points de passage 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 suivants sont des points de cheminement, l'itinéraire tracé traverse.

Continuez à ajouter des points de cheminement en indiquant "/ latitude, longitude" à la fin. Il y a apparemment une limite de 23 points de passage selon google docs. Je ne sais pas si cela s'applique également à Android.

+0

Ne fonctionne pas, pouvez-vous aider? –

+0

Qu'est-ce qui ne fonctionne pas? Que voyez-vous en exécutant ce code exact? –

+0

En fait, n'utilisez pas les coordonnées exactes que je mets ici. Ils sont au milieu de nulle part, quelque part sans routes autour de sorte que cela ne fonctionnera pas. –

2

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

En utilisant les dernières URL multi-plateforme Google Maps: Même si l'application Google Maps est manquant, il 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); 
0

Si vous souhaitez afficher la latitude et la longitude à partir du curr ent direction, vous pouvez utiliser ceci:

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

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

google.navigation:q=latitude,longitude 

utilisation ci-dessus:

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 par emplacement, utilisez:

google.navigation:q=a+street+address 

Plus d'info ici: Google Maps Intents for Android

7
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())); 
+1

excellent! Je pense que votre réponse doit être la première depuis que la nouvelle API est arrivée. – Mogi

Questions connexes