Avvio di Google Maps Directions tramite un intento su Android


Risposte:


630

Puoi usare qualcosa del genere:

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

Per avviare la navigazione dalla posizione corrente, rimuovere il saddrparametro e il valore.

È possibile utilizzare un indirizzo attuale anziché latitudine e longitudine. Tuttavia, ciò consentirà all'utente di scegliere una finestra di dialogo tra l'apertura tramite browser o Google Maps.

Ciò attiverà direttamente Google Maps in modalità di navigazione:

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

AGGIORNARE

Nel maggio 2017 Google ha lanciato la nuova API per gli URL universali e multipiattaforma di Google Maps:

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

Puoi usare Intents anche con la nuova API.


2
Non che ne sia a conoscenza. Tuttavia, non verrà visualizzata alcuna finestra di dialogo se l'utente ha già scelto l'app predefinita per aprire questo tipo di intenti come app per la mappa.
Jan S.

111
Se si desidera eliminare la finestra di dialogo, è possibile fornire all'intento un suggerimento su quale pacchetto si desidera utilizzare. Prima di startActivity () aggiungi questo: intent.setClassName("com.google.android.apps.maps", "com.google.android.maps.MapsActivity");
Jeremy Logan,

e come forzarlo per mostrarlo sul navigatore e non sull'applicazione googlemaps?
NullPointerException il

68
Costringere l'utente a un'attività specifica quando potrebbe avere altre app che preferisce sembra contrario al mio spirito Android. Sarei tentato di lasciare che i filtri di intenti si occupino delle cose qui.
superluminario,

15
Le intenzioni di navigazione sembrano essere ufficialmente supportate ora: developers.google.com/maps/documentation/android/…
Sanketh Katta,

124

Questo è un po 'fuori tema perché hai chiesto "indicazioni", ma puoi anche utilizzare lo schema URI geografico descritto nella documentazione di Android:

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

Il problema con "geo: latitudine, longitudine" è che Google Maps si concentra solo sul tuo punto, senza spille o etichette.

È abbastanza confuso, soprattutto se devi indicare un luogo preciso o / e chiedere indicazioni stradali.

Se usi il parametro di query "geo: lat, lon? Q = name" per etichettare il tuo geopoint, usa la query per la ricerca e ignora i parametri lat / lon.

Ho trovato un modo per centrare la mappa con lat / lon e visualizzare un segnaposto con un'etichetta personalizzata, molto bello da visualizzare e utile quando chiedi indicazioni o qualsiasi altra azione:

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

NOTA (di @TheNail): non funziona in Maps v.7 (ultima versione al momento della scrittura). Ignorerà le coordinate e cercherà un oggetto con il nome specificato tra parentesi. Vedi anche Intento per Google Maps 7.0.0 con posizione


3
Bene, la geo predefinita: 0,0 sposta semplicemente la mappa lì. Questa soluzione ["geo: 0,0? Q = 37.423156, -122.084917 (" + nome + ")"] ti consente di inserire il tuo nome di marcatore. Grazie.
Gnac,

4
Funziona benissimo - fyi non sembra funzionare insieme al parametro di query "z" (livello di zoom)
scolestock

1
È possibile impostare la modalità di transito predefinita nell'intento. Per impostazione predefinita, l'opzione auto è selezionata. Posso impostare Walking come modalità predefinita?
Orso

6
Perché non usi geo:37.423156,-122.084917?q=37.423156,-122.084917 ...?
riaccendere il

1
Assicurati di urlEncode il parametro label. Ho avuto problemi con personaggi speciali come lo spazio.
Ethan,

100

Sebbene le risposte attuali siano fantastiche, nessuna di queste ha fatto esattamente quello che stavo cercando, volevo aprire solo l'app delle mappe, aggiungere un nome per ciascuna posizione e destinazione di origine, utilizzando lo schema URI geografico non avrebbe funzionato per me e il link web delle mappe non aveva etichette, quindi ho trovato questa soluzione, che è essenzialmente una fusione delle altre soluzioni e dei commenti fatti qui, si spera che sia utile per gli altri visualizzare questa domanda.

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

Per utilizzare la posizione corrente come punto di partenza (purtroppo non ho trovato il modo di etichettare la posizione corrente), utilizzare quanto segue

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

Per completezza, se l'utente non ha installato l'app per le mappe, sarà una buona idea catturare ActivityNotFoundException, quindi possiamo ricominciare l'attività senza la limitazione dell'app per le mappe, possiamo essere abbastanza sicuri che non avremo mai toast alla fine, poiché un browser Internet è un'applicazione valida per avviare anche questo schema di URL.

        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 Eventuali latitudini o longitudini utilizzate nel mio esempio non sono rappresentative della mia posizione, qualsiasi somiglianza con una posizione reale è pura coincidenza, ovvero non vengo dall'Africa: P

MODIFICARE:

Per le indicazioni stradali, ora è supportato un intento di navigazione con 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);

2
Questa è un'ottima risposta David! Sai anche come avviare veramente la navigazione mentre sei all'interno dell'app di navigazione? Allo stato attuale, l'utente deve fare clic su "Avvia navigazione" un'ultima volta. Ho cercato su Google qualsiasi parametro da passare, ma non sono riuscito a trovarne nessuno.
Nirmal,

Quando si preme il pulsante Indietro dall'app Mappe, viene visualizzata una schermata nera e viene ricreata l'attività sottostante. Qualche idea su come risolvere questo problema?
Jas,

@Jas rimuovere il metodo intent.setclassname
Ameen Maheen il

ciao, il codice sopra sta impiegando molto tempo ad avviare l'app di mappa predefinita nella versione 4.4.2, 4.4.4 e 5.0.2 di Android. Sta andando bene in versione 5.1 e Marshmallow. La prego di aiutare a risolvere questo problema.
OnePunchMan il

Vorrei ora suggerire di usare intent.SetPackage invece di intent.setClassName ("com.google.android.apps.maps", "com.google.android.maps.MapsActivity"); Aggiornerò la risposta per riflettere questo.
David Thompson,

22

Utilizzo degli ultimi URL di Google Maps multipiattaforma : anche se manca l'app Google Maps, questa si aprirà nel browser

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

10

Apri Google Maps utilizzando Intent con diverse modalità:

Possiamo aprire l'app di Google Maps usando l'intento:

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)

Qui, "mode = b" è per la bicicletta.

Possiamo impostare la modalità di guida, a piedi e in bicicletta utilizzando:

  • d per la guida
  • w per camminare
  • b per andare in bicicletta

Puoi trovare ulteriori informazioni sull'intenzione con google maps qui .

Nota: se non esiste un percorso per la bicicletta / auto / a piedi, verrà visualizzato "Impossibile trovare la strada"

Puoi controllare la mia risposta originale qui .


8

Bene, puoi provare ad aprire l'applicazione integrata Android Maps utilizzando il Intent.setClassNamemetodo

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

6

Per i punti a più vie, è possibile utilizzare anche quanto segue.

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

La prima serie di coordinate è la posizione iniziale. Tutti i prossimi sono punti intermedi, il percorso tracciato passa attraverso.

Continua ad aggiungere punti intermedi concedendo "/ latitudine, longitudine" alla fine. Apparentemente esiste un limite di 23 punti di passaggio secondo i documenti di Google . Non sono sicuro se questo vale anche per Android.


Cosa non funziona? Cosa vedi quando esegui questo codice esatto?
Adeel Tariq,

In realtà non usare le coordinate esatte che ho inserito qui. Sono nel bel mezzo del nulla, da qualche parte senza strade intorno, quindi non funzionerà.
Adeel Tariq,

4

Se sei interessato a mostrare Latitudine e Longitudine dalla direzione corrente, puoi usare questo:

Le indicazioni vengono sempre fornite dalla posizione corrente dell'utente.

La seguente query ti aiuterà a farlo. Puoi passare la latitudine e la longitudine della destinazione qui:

google.navigation:q=latitude,longitude

Usa sopra come:

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

O se vuoi mostrare tramite posizione, usa:

google.navigation:q=a+street+address

Maggiori informazioni qui: Google Maps Intents per Android


perché le indicazioni stradali funzionassero, dovevo aggiungeremapIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
Someone Somewhere

4

Google DirectionsViewcon posizione di origine come posizione corrente e destinazione come data come stringa

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

In quanto sopra destinationCityNameè una stringa variabile modificata come richiesto.


3

prova questo

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

3

Questo è ciò che ha funzionato per me:

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

1

se conosci il punto A, il punto B (e qualsiasi altra funzione o traccia tra di loro) puoi usare un file KML insieme alle tue intenzioni.

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

per maggiori informazioni, vedi questa risposta SO

NOTA: in questo esempio viene utilizzato un file di esempio che (a partire da mar13) è ancora online. se è andato offline, trova un file kml online e cambia l'URL


1
Quando si preme il pulsante Indietro dall'app Mappe, viene visualizzata una schermata nera e viene ricreata l'attività sottostante. Qualche idea su come risolvere questo problema?
Jas,

@Jas, google ha cambiato molte delle sue API e anche questo comportamento è cambiato. uso mappe stradali aperte esclusivamente da un po 'di tempo, quindi sarei in grado di aiutarti. :)
tony gil,

0

Per prima cosa devi ora che puoi usare l'intento implicito, la documentazione di Android ci fornisce un intento comune molto dettagliato per implementare l'intento della mappa di cui hai bisogno per creare un nuovo intento con due parametri

  • Azione
  • Uri

Per l'azione che possiamo usare Intent.ACTION_VIEW e per Uri dovremmo costruirlo, di seguito ho allegato un codice di esempio per creare, costruire, avviare l'attività.

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

1
L'uso di Uri.Builder funziona solo con URI assoluti, sotto forma di:, <scheme>://<authority><absolute path>?<query>#<fragment>non URI opachi <scheme>:<opaque part>#<fragment>. Il codice sopra riportato produce il seguente URI: geo:/0%2C0?Eiffel%20Towerche provoca l'arresto anomalo dell'app Google Maps. Anche la documentazione ufficiale utilizza URI grezzi / opachi proprio per questo motivo. Il codice corretto sarebbe quindi:Uri.parse("geo:0,0?q=" + Uri.encode("Eiffel Tower"))
bitek,

Si veda anche questa risposta per una spiegazione del motivo per cui la vostra risposta non funziona: stackoverflow.com/a/12035226/313113
Bitek

0

Una bella soluzione kotlin, che utilizza l'ultima risposta multipiattaforma menzionata da lakshman sai ...

Nessun Uri.toString non necessario e Uri.parse però, questa risposta pulita e 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
 })

0

In questo modo puoi avviare Google Maps Directions tramite un intento su Android

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

    });
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.