Starten von Google Maps Directions über eine Absicht unter Android

Antworten:

630

Sie könnten so etwas verwenden:

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

Entfernen Sie den saddrParameter und den Wert , um die Navigation vom aktuellen Standort aus zu starten .

Sie können anstelle von Breiten- und Längengrad eine tatsächliche Adresse verwenden. Dies gibt dem Benutzer jedoch einen Dialog, in dem er zwischen dem Öffnen über einen Browser oder Google Maps wählen kann.

Dadurch wird Google Maps direkt im Navigationsmodus gestartet:

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

AKTUALISIEREN

Im Mai 2017 hat Google die neue API für universelle, plattformübergreifende Google Maps-URLs veröffentlicht:

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

Sie können Intents auch mit der neuen API verwenden.

Jan S.
quelle
2
Nicht dass ich wüsste. Es wird jedoch kein Dialogfeld angezeigt, wenn der Benutzer bereits die Standard-App ausgewählt hat, um diese Art von Absichten als Karten-App zu öffnen.
Jan S.
111
Wenn Sie den Dialog entfernen möchten, können Sie der Absicht einen Hinweis geben, welches Paket Sie verwenden möchten. Vor dem StartActivity () fügen Sie Folgendes hinzu: intent.setClassName("com.google.android.apps.maps", "com.google.android.maps.MapsActivity");
Jeremy Logan
und wie man forze, um es im Navigator und nicht in der Google Maps-Anwendung anzuzeigen?
NullPointerException
68
Den Benutzer zu einer bestimmten Aktivität zu zwingen, wenn er andere Apps hat, die er bevorzugt, scheint mir im Widerspruch zum Android-Geist zu stehen. Ich wäre versucht, die Absichtsfilter hier für die Dinge sorgen zu lassen.
Superluminary
15
Navigationsabsichten scheinen jetzt offiziell unterstützt zu werden: developer.google.com/maps/documentation/android/…
Sanketh Katta
124

Dies ist ein wenig abseits des Themas, da Sie nach "Anweisungen" gefragt haben. Sie können jedoch auch das in der Android-Dokumentation beschriebene Geo-URI-Schema verwenden:

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

Das Problem bei der Verwendung von "Geo: Breite, Länge" besteht darin, dass Google Maps nur an Ihrem Punkt zentriert ist, ohne Stift oder Beschriftung.

Das ist ziemlich verwirrend, besonders wenn Sie auf einen genauen Ort zeigen oder / und nach dem Weg fragen müssen.

Wenn Sie den Abfrageparameter "geo: lat, lon? Q = name" verwenden, um Ihren Geopunkt zu kennzeichnen, wird die Abfrage zum Suchen und Löschen der lat / lon-Parameter verwendet.

Ich habe einen Weg gefunden, die Karte mit lat / lon zu zentrieren und eine Stecknadel mit einem benutzerdefinierten Etikett anzuzeigen, die sehr schön anzuzeigen ist und nützlich ist, wenn ich nach dem Weg oder einer anderen Aktion frage:

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

HINWEIS (von @TheNail): Funktioniert nicht in Maps v.7 (neueste Version zum Zeitpunkt des Schreibens). Ignoriert die Koordinaten und sucht nach einem Objekt mit dem angegebenen Namen zwischen den Klammern. Siehe auch Absicht für Google Maps 7.0.0 mit Standort

Murphy
quelle
3
Schön, das Standard-Geo: 0,0 verschiebt die Karte einfach dorthin. Mit dieser Lösung ["geo: 0,0? Q = 37.423156, -122.084917 (" + name + ")"] können Sie Ihren eigenen Markernamen eingeben. Vielen Dank.
Gnac
4
Funktioniert hervorragend - fyi scheint nicht in Verbindung mit dem Abfrageparameter "z" (
Zoomstufe
1
Ist es möglich, den Standard-Transitmodus in der Absicht festzulegen? Standardmäßig ist die Fahrzeugoption ausgewählt. Kann ich Walking als Standardmodus festlegen?
Bär
6
Warum benutzt du nicht geo:37.423156,-122.084917?q=37.423156,-122.084917 ...?
rekire
1
Stellen Sie sicher, dass Sie den Label-Parameter urlEncode. Ich hatte Probleme mit Sonderzeichen wie Leerzeichen.
Ethan
100

Obwohl die aktuellen Antworten großartig sind, hat keiner von ihnen genau das getan, wonach ich gesucht habe. Ich wollte nur die Karten-App öffnen und einen Namen für jeden Quellort und jedes Ziel hinzufügen. Die Verwendung des Geo-URI-Schemas würde für mich nicht funktionieren Der Weblink für Karten hatte überhaupt keine Beschriftungen, daher habe ich diese Lösung entwickelt, die im Wesentlichen eine Zusammenführung der anderen hier gemachten Lösungen und Kommentare darstellt. Hoffentlich ist sie für andere hilfreich, die diese Frage betrachten.

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

Um Ihren aktuellen Standort als Ausgangspunkt zu verwenden (leider habe ich keine Möglichkeit gefunden, den aktuellen Standort zu kennzeichnen), verwenden Sie Folgendes

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

Der Vollständigkeit halber: Wenn der Benutzer die Karten-App nicht installiert hat, ist es eine gute Idee, die ActivityNotFoundException abzufangen. Dann können wir die Aktivität ohne Einschränkung der Karten-App erneut starten. Wir können ziemlich sicher sein, dass wir sie niemals erhalten zum Toast am Ende, da ein Internetbrowser eine gültige Anwendung ist, um auch dieses URL-Schema zu starten.

        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 Alle in meinem Beispiel verwendeten Breiten- oder Längengrade sind nicht repräsentativ für meinen Standort. Eine Ähnlichkeit mit einem echten Standort ist reiner Zufall, auch wenn ich nicht aus Afrika stamme: P.

BEARBEITEN:

Für Wegbeschreibungen wird jetzt eine Navigationsabsicht mit google.navigation unterstützt

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
quelle
2
Das ist eine großartige Antwort, David! Wissen Sie auch, wie Sie die Navigation in der Navigations-App wirklich starten können? In seinem aktuellen Zustand muss der Benutzer ein letztes Mal auf "Navigation starten" klicken. Ich habe Google nach einem zu übergebenden Parameter durchsucht, aber keinen gefunden.
Nirmal
Wenn Sie die Zurück-Taste in der Karten-App drücken, wird ein schwarzer Bildschirm angezeigt und die zugrunde liegende Aktivität wird neu erstellt. Haben Sie eine Idee, wie Sie dies beheben können?
Jas
@Jas entfernen intent.setclassname Methode
Ameen Maheen
Hallo, der obige Code braucht lange, um die Standard-Karten-App in den Android-Versionen 4.4.2, 4.4.4 und 5.0.2 zu starten. Es startet gut in 5.1 und Marshmallow-Version. Könnten Sie bitte bei der Lösung dieses Problems helfen?
OnePunchMan
Ich würde jetzt vorschlagen, intent.SetPackage anstelle von intent.setClassName ("com.google.android.apps.maps", "com.google.android.maps.MapsActivity") zu verwenden. Ich werde die Antwort aktualisieren, um dies widerzuspiegeln.
David Thompson
22

Verwenden der neuesten plattformübergreifenden Google Maps-URLs : Auch wenn die Google Maps-App fehlt, wird sie im Browser geöffnet

Beispiel 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
quelle
10

Öffnen Sie Google Maps mit Intent in verschiedenen Modi:

Wir können die Google Maps App mit Absicht öffnen:

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)

Hier ist "mode = b" für Fahrrad.

Wir können den Fahr-, Geh- und Fahrradmodus einstellen, indem wir Folgendes verwenden:

  • d zum fahren
  • w zum Laufen
  • b zum Radfahren

Weitere Informationen zu Absichten mit Google Maps finden Sie hier .

Hinweis: Wenn es keine Route für Fahrrad / Auto / Spaziergang gibt, wird angezeigt, dass der Weg dorthin nicht gefunden werden kann.

Sie können meine ursprüngliche Antwort hier überprüfen .

SANAT
quelle
8

Nun, Sie können versuchen, die integrierte Anwendung Android Maps mithilfe der Intent.setClassNameMethode zu öffnen .

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
quelle
6

Für mehrere Wegpunkte kann auch Folgendes verwendet werden.

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

Der erste Satz von Koordinaten ist Ihr Startort. Alle nächsten sind Wegpunkte, die geplante Route führt durch.

Fügen Sie einfach weitere Wegpunkte hinzu, indem Sie am Ende "/ Breite, Länge" angeben. Laut Google Docs gibt es anscheinend ein Limit von 23 Wegpunkten . Ich bin mir nicht sicher, ob dies auch für Android gilt.

Adeel Tariq
quelle
Was funktioniert nicht? Was sehen Sie, wenn Sie genau diesen Code ausführen?
Adeel Tariq
Verwenden Sie eigentlich nicht die genauen Koordinaten, die ich hier eingegeben habe. Sie sind mitten im Nirgendwo ohne Straßen, so dass das nicht funktioniert.
Adeel Tariq
4

Wenn Sie den Breiten- und Längengrad aus der aktuellen Richtung anzeigen möchten, können Sie Folgendes verwenden:

Anweisungen werden immer vom aktuellen Standort des Benutzers gegeben.

Die folgende Abfrage hilft Ihnen dabei. Hier können Sie den Breiten- und Längengrad des Ziels eingeben:

google.navigation:q=latitude,longitude

Verwenden Sie oben als:

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

Oder wenn Sie über den Ort anzeigen möchten, verwenden Sie:

google.navigation:q=a+street+address

Weitere Informationen hier: Google Maps Intents für Android

WannaBeGeek
quelle
Für die Wegbeschreibung musste ich hinzufügenmapIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
Jemand irgendwo
4

Google DirectionsViewmit Quellspeicherort als aktuellem Standort und Zielspeicherort als Zeichenfolge

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

Oben destinationCityNameist eine Zeichenfolge variabel, die nach Bedarf geändert werden kann.

Ramesh Kumar
quelle
3

Versuche dies

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
quelle
3

Das hat bei mir funktioniert:

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
quelle
1

Wenn Sie Punkt A, Punkt B (und alle dazwischen liegenden Funktionen oder Spuren) kennen, können Sie zusammen mit Ihrer Absicht eine KML-Datei verwenden.

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

Weitere Informationen finden Sie in dieser SO-Antwort

HINWEIS: In diesem Beispiel wird eine Beispieldatei verwendet, die (Stand: März 13) noch online ist. Wenn es offline gegangen ist, suchen Sie eine kml-Datei online und ändern Sie Ihre URL

Tony Gil
quelle
1
Wenn Sie die Zurück-Taste in der Karten-App drücken, wird ein schwarzer Bildschirm angezeigt und die zugrunde liegende Aktivität wird neu erstellt. Haben Sie eine Idee, wie Sie dies beheben können?
Jas
@Jas, Google hat viele seiner APIs geändert und dieses Verhalten hat sich möglicherweise auch geändert. Ich benutze seit einiger Zeit ausschließlich offene Straßenkarten, damit ich Ihnen helfen kann. :)
Tony Gil
0

Zuerst müssen Sie jetzt, da Sie die implizite Absicht verwenden können, die Android-Dokumentation liefert uns sehr detaillierte allgemeine Absichten für die Implementierung der Kartenabsicht, die Sie benötigen, um eine neue Absicht mit zwei Parametern zu erstellen

  • Aktion
  • Uri

Für Aktionen, die wir verwenden können, Intent.ACTION_VIEW und für Uri sollten wir sie erstellen. Unten habe ich einen Beispielcode angehängt, um die Aktivität zu erstellen, zu erstellen und zu starten.

 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
quelle
1
Die Verwendung von Uri.Builder funktioniert nur für absolute URIs in Form von:, <scheme>://<authority><absolute path>?<query>#<fragment>nicht für undurchsichtige URIs <scheme>:<opaque part>#<fragment>. Der obige Code liefert den folgenden URI: geo:/0%2C0?Eiffel%20TowerDadurch stürzt die Google Maps-App ab. Sogar die offizielle Dokumentation verwendet aus diesem Grund rohe / undurchsichtige URIs. Der richtige Code wäre dann:Uri.parse("geo:0,0?q=" + Uri.encode("Eiffel Tower"))
Bitek
In dieser Antwort finden Sie auch eine Erklärung, warum Ihre Antwort nicht funktioniert: stackoverflow.com/a/12035226/313113
Bitek
0

Eine nette Kotlin-Lösung, die die neueste plattformübergreifende Antwort von lakshman sai verwendet ...

Kein unnötiger Uri.toString und der Uri.parse, diese Antwort ist sauber und minimal:

 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
quelle
0

Auf diese Weise können Sie Google Maps Directions über eine Absicht auf Android starten

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
quelle