Uruchamianie Kierunków w Mapach Google przez system Android

Odpowiedzi:

630

Możesz użyć czegoś takiego:

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

Aby rozpocząć nawigację od bieżącej lokalizacji, usuń saddrparametr i wartość.

Możesz użyć rzeczywistego adresu zamiast szerokości i długości geograficznej. Daje to jednak użytkownikowi okno dialogowe do wyboru między otwarciem go za pomocą przeglądarki lub Map Google.

Spowoduje to bezpośrednie uruchomienie Map Google w trybie nawigacji:

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

AKTUALIZACJA

W maju 2017 r. Google uruchomił nowy interfejs API dla uniwersalnych, wieloplatformowych adresów URL Map Google:

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

Z nowego interfejsu API można również korzystać z funkcji Intents.

Jan S.
źródło
2
Nie, że jestem tego świadomy. Jednak nie będzie żadnego okna dialogowego, jeśli użytkownik wybrał już domyślną aplikację do otwierania tego rodzaju zamiarów jako aplikacji mapowej.
Jan S.
111
Jeśli chcesz pozbyć się okna dialogowego, możesz dać wskazówkę, którego pakietu chcesz użyć. Przed startActivity () dodaj to: intent.setClassName("com.google.android.apps.maps", "com.google.android.maps.MapsActivity");
Jeremy Logan
i jak forze, aby pokazać go w nawigatorze, a nie w aplikacji googlemaps?
NullPointerException
68
Zmuszanie użytkownika do określonej czynności, gdy mogą mieć inne aplikacje, które wolą, wydaje mi się sprzeczne z połączeniem go z duchem Androida. Kusiłoby mnie, aby filtry intencyjne zajęły się tym tutaj.
superluminarny
15
Wydaje się, że intencje nawigacji są teraz oficjalnie obsługiwane: developers.google.com/maps/documentation/android/…
Sanketh Katta
124

Jest to trochę nie na temat, ponieważ poprosiłeś o „wskazówki”, ale możesz również użyć schematu Geo URI opisanego w Dokumentacji Androida:

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

Problem z użyciem „geo: szerokość, długość” polega na tym, że Mapy Google są wyśrodkowane tylko w twoim punkcie, bez żadnej pinezki ani etykiety.

To dość mylące, zwłaszcza jeśli musisz wskazać konkretne miejsce lub zapytać o drogę.

Jeśli użyjesz parametru zapytania „geo: lat, lon? Q = name”, aby oznaczyć swój geopoint, użyje on zapytania do wyszukiwania i odrzuci parametry lat / lon.

Znalazłem sposób na wyśrodkowanie mapy za pomocą lat / lon i wyświetlanie pinezki z niestandardową etykietą, bardzo ładnej do wyświetlania i przydatnej, gdy pytasz o drogę lub inną akcję:

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

UWAGA (autor @TheNail): Nie działa w Maps v.7 (najnowsza wersja w momencie pisania). Zignoruje współrzędne i poszuka obiektu o podanej nazwie między nawiasami. Zobacz także Intent dla Google Maps 7.0.0 z lokalizacją

Murphy
źródło
3
Fajnie, domyślna geo: 0,0 po prostu przenosi tam mapę. To rozwiązanie [„geo: 0,0? Q = 37.423156, -122.084917 („ + name + ”)”] pozwala wprowadzić własną nazwę znacznika. Dzięki.
gnac
4
Działa świetnie - FYI nie wydaje się działać w połączeniu z „Z” parametrem zapytania (poziom zoom)
scolestock
1
Czy możliwe jest ustawienie domyślnego trybu transportu w ten sposób? Domyślnie wybrana jest opcja samochodu. Czy mogę ustawić Walking jako tryb domyślny?
Niedźwiedź
6
Dlaczego nie używasz geo:37.423156,-122.084917?q=37.423156,-122.084917 ...?
rekire
1
Upewnij się, że urlEncode parametr etykiety. Miałem problemy ze znakami specjalnymi, takimi jak spacja.
Ethan
100

Chociaż obecne odpowiedzi są świetne, żadna z nich nie zrobiła tego, czego szukałem, chciałem tylko otworzyć aplikację map, dodać nazwę dla każdej lokalizacji źródłowej i docelowej, użycie schematu geograficznego URI nie zadziałałoby dla mnie w ogóle, a link do mapy nie miał etykiet, więc wymyśliłem to rozwiązanie, które jest zasadniczo połączeniem innych rozwiązań i komentarzy tutaj napisanych, mam nadzieję, że jest to pomocne dla innych osób przeglądających to pytanie.

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

Aby użyć bieżącej lokalizacji jako punktu początkowego (niestety nie znalazłem sposobu na oznaczenie bieżącej lokalizacji), użyj następujących

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

Dla kompletności, jeśli użytkownik nie ma zainstalowanej aplikacji map, dobrym pomysłem będzie złapanie wyjątku ActivityNotFoundException, wtedy możemy ponownie rozpocząć aktywność bez ograniczeń aplikacji map, możemy być całkiem pewni, że nigdy nie dostaniemy do Toast na końcu, ponieważ przeglądarka internetowa jest prawidłową aplikacją do uruchamiania tego schematu 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 Wszelkie szerokości i długości geograficzne użyte w moim przykładzie nie są reprezentatywne dla mojej lokalizacji, każde podobieństwo do prawdziwej lokalizacji jest czystym zbiegiem okoliczności, alias nie jestem z Afryki: P

EDYTOWAĆ:

Aby uzyskać wskazówki, cel nawigacji jest teraz obsługiwany przez 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);
David Thompson
źródło
2
To świetna odpowiedź, David! Czy wiesz także, jak naprawdę rozpocząć nawigację w aplikacji do nawigacji? W obecnym stanie użytkownik musi po raz ostatni kliknąć „Rozpocznij nawigację”. Szukałem w Google dowolnego parametru do przekazania, ale nie mogłem go znaleźć.
Nirmal
Po naciśnięciu przycisku Wstecz w aplikacji Mapy pojawia się czarny ekran i odtwarzana jest podstawowa aktywność. Masz pomysł, jak to naprawić?
Jas
@Jas usuwa metodę intent.setclassname
Ameen Maheen,
cześć, powyższy kod zajmuje dużo czasu, aby uruchomić domyślną aplikację map w wersji Androida 4.4.2, 4.4.4 i 5.0.2. Premiera w wersji 5.1 i Marshmallow. Czy możesz pomóc w rozwiązaniu tego problemu.
OnePunchMan
Sugerowałbym teraz użycie intent.SetPackage zamiast intent.setClassName („com.google.android.apps.maps”, „com.google.android.maps.MapsActivity”); Zaktualizuję odpowiedź, aby to odzwierciedlić.
David Thompson,
22

Korzystanie z najnowszych wieloplatformowych adresów URL Map Google : Nawet jeśli brakuje aplikacji Google Maps, otworzy się w przeglądarce

Przykład 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
źródło
10

Otwórz Mapy Google, używając Intent z różnymi trybami:

Możemy otworzyć aplikację Google Maps przy użyciu zamiaru:

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)

Tutaj „mode = b” dotyczy roweru.

Możemy ustawić tryb jazdy, chodzenia i jazdy rowerem za pomocą:

  • d do prowadzenia pojazdu
  • w do chodzenia
  • b do jazdy na rowerze

Możesz znaleźć więcej informacji na temat zamiarów w Google Maps tutaj .

Uwaga: jeśli nie ma trasy dla roweru / samochodu / pieszego, wyświetli się komunikat „Nie można znaleźć drogi”

Można sprawdzić mój oryginalny odpowiedź tutaj .

SANAT
źródło
8

Możesz spróbować otworzyć wbudowaną aplikację Android Maps, korzystając z tej Intent.setClassNamemetody.

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
źródło
6

W przypadku wielu punktów nawigacyjnych można również zastosować następujące.

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

Pierwszy zestaw współrzędnych to twoja początkowa lokalizacja. Wszystkie następne są punktami drogi, przez którą planowana trasa przebiega.

Po prostu dodawaj punkty, kończąc na końcu „/ szerokość, długość”. Według dokumentów Google istnieje limit 23 punktów na drodze . Nie jestem pewien, czy dotyczy to również Androida.

Adeel Tariq
źródło
Co nie działa? Co widzisz podczas wykonywania tego dokładnego kodu?
Adeel Tariq
Właściwie nie używaj dokładnych współrzędnych, które tu umieściłem. Są gdzieś pośrodku nigdzie, gdzie nie ma dróg, więc to nie zadziała.
Adeel Tariq
4

Jeśli chcesz wyświetlić szerokość i długość geograficzną z bieżącego kierunku, możesz użyć tego:

Wskazówki są zawsze podawane z bieżącej lokalizacji użytkownika.

Poniższe zapytanie pomoże ci to wykonać. Tutaj możesz podać szerokość i długość geograficzną miejsca docelowego:

google.navigation:q=latitude,longitude

Użyj powyżej jako:

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

Lub jeśli chcesz wyświetlać według lokalizacji, użyj:

google.navigation:q=a+street+address

Więcej informacji tutaj: Google Maps Intents dla Androida

WannaBeGeek
źródło
aby uzyskać wskazówki dojazdu, musiałem dodaćmapIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
Someone Somewhere
4

Google DirectionsViewz lokalizacją źródłową jako bieżącą lokalizację i lokalizację docelową podaną jako ciąg

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

Powyżej destinationCityNameznajduje się zmienny ciąg znaków, w zależności od potrzeb.

Ramesh Kumar
źródło
3

Spróbuj tego

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
źródło
3

Oto, co zadziałało dla mnie:

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
źródło
1

jeśli znasz punkt A, punkt B (i dowolne elementy lub ścieżki pomiędzy nimi), możesz użyć pliku KML wraz z twoją intencją.

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

Aby uzyskać więcej informacji, zobacz tę odpowiedź SO

UWAGA: w tym przykładzie użyto przykładowego pliku, który (od marca 13) jest nadal online. jeśli przejdzie w tryb offline, znajdź plik kml online i zmień swój adres URL

Tony Gil
źródło
1
Po naciśnięciu przycisku Wstecz w aplikacji Mapy pojawia się czarny ekran i odtwarzana jest podstawowa aktywność. Masz pomysł, jak to naprawić?
Jas
@Ja, Google zmieniło wiele swoich interfejsów API i to zachowanie może się również zmienić. Od dłuższego czasu używam wyłącznie otwartych map ulic, więc mógłbym ci pomóc. :)
Tony Gil
0

Najpierw musisz teraz, abyś mógł korzystać z niejawnego zamiaru, dokumentacja Androida zapewnia nam bardzo szczegółowe wspólne zamiary dotyczące wdrożenia zamiaru mapy, musisz stworzyć nowy zamiar z dwoma parametrami

  • Akcja
  • Uri

Do akcji, której możemy użyć, Intent.ACTION_VIEW a dla Uri powinniśmy ją zbudować, poniżej załączyłem przykładowy kod, aby utworzyć, zbudować, rozpocząć działanie.

 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
źródło
1
Korzystanie z Uri.Builder działa tylko w przypadku bezwzględnych URI, w postaci:, a <scheme>://<authority><absolute path>?<query>#<fragment>nie nieprzejrzystych URI <scheme>:<opaque part>#<fragment>. Powyższy kod daje następujący identyfikator URI: geo:/0%2C0?Eiffel%20Towerco powoduje awarię aplikacji Google Maps. Nawet oficjalna dokumentacja używa surowych / nieprzezroczystych identyfikatorów URI z tego właśnie powodu. Poprawny kod brzmiałby wtedy:Uri.parse("geo:0,0?q=" + Uri.encode("Eiffel Tower"))
bitek
Zobacz także odpowiedź na wyjaśnienie, dlaczego twoja odpowiedź nie działa: stackoverflow.com/a/12035226/313113
bitek
0

Ładne rozwiązanie dla kotlin, wykorzystujące najnowszą odpowiedź międzyplatformową wspomnianą przez lakshman sai ...

Bez zbędnych Uri.toString i Uri.parse, ta odpowiedź jest czysta i minimalna:

 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
źródło
0

W ten sposób możesz uruchamiać Mapy Google, korzystając z systemu 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);
            }
        }

    });
Jay Patoliya
źródło