Aplikacja Mapy Google na Androida udostępnia kilka intencji, które możesz wykorzystać do uruchomienia Map Google w trybie wyświetlania, wyszukiwania, nawigacji lub Street View. Jeśli chcesz osadzić mapę w aplikacji, zapoznaj się z przewodnikiem interfejsu API Map Google na Androida.
Omówienie
Intencje umożliwiają rozpoczęcie działania w innej aplikacji poprzez opisanie prostego działania, które chcesz wykonać (np. „wyświetl mapę” lub „pokaż wskazówki do lotniska”), w obiekcie Intent
. Aplikacja Mapy Google na Androida obsługuje kilka różnych intencji, które umożliwiają uruchomienie aplikacji Mapy Google i wykonanie jednego z 4 działań:
- Wyświetlanie mapy w określonej lokalizacji i poziomie powiększenia.
- wyszukiwać lokalizacje i miejsca oraz wyświetlać je na mapie;
- prosić o wskazówkę dojazdu z jednego miejsca do drugiego. Wskazówki mogą być zwracane dla 3 rodzajów transportu: samochodem, pieszo i rowerem.
- wyświetlać zdjęcia panoramiczne w Google Street View.
Ta strona opisuje intencje, których możesz używać w aplikacji Mapy Google na Androida. Więcej informacji o intencjach i filtrach intencji oraz intencjach wspólnych dla platformy Android znajdziesz w dokumentacji dla deweloperów Androida.
Żądania dotyczące intencji
Aby uruchomić Mapy Google z zamierzeniem, musisz najpierw utworzyć obiekt Intent
, określając jego działanie, identyfikator URI i pakiet.
- Działanie: wszystkie intencje Map Google są wywoływane jako działanie wyświetlania —
ACTION_VIEW
. - Identyfikator URI: intencje Map Google używają kodowanych adresów URL, które określają pożądane działanie wraz z niektórymi danymi umożliwiającymi jego wykonanie.
- Pakiet: wywołanie funkcji
setPackage("com.google.android.apps.maps")
spowoduje, że aplikacja Mapy Google na Androida będzie obsługiwać intencję. Jeśli pakiet nie jest ustawiony, system określi, które aplikacje mogą obsługiwaćIntent
. Jeśli dostępnych jest kilka aplikacji, użytkownik może zostać poproszony o wybranie tej, której chce użyć.
Po utworzeniu Intent
możesz poprosić system o uruchomienie powiązanej aplikacji na kilka sposobów. Typową metodą jest przekazanie wartości Intent
do metody startActivity()
. System uruchomi niezbędną aplikację (w tym przypadku Mapy Google) i odpowiednią Activity
.
Java
// Create a Uri from an intent string. Use the result to create an Intent. Uri gmmIntentUri = Uri.parse("google.streetview:cbll=46.414382,10.013988"); // Create an Intent from gmmIntentUri. Set the action to ACTION_VIEW Intent mapIntent = new Intent(Intent.ACTION_VIEW, gmmIntentUri); // Make the Intent explicit by setting the Google Maps package mapIntent.setPackage("com.google.android.apps.maps"); // Attempt to start an activity that can handle the Intent startActivity(mapIntent);
Kotlin
// Create a Uri from an intent string. Use the result to create an Intent. val gmmIntentUri = Uri.parse("google.streetview:cbll=46.414382,10.013988") // Create an Intent from gmmIntentUri. Set the action to ACTION_VIEW val mapIntent = Intent(Intent.ACTION_VIEW, gmmIntentUri) // Make the Intent explicit by setting the Google Maps package mapIntent.setPackage("com.google.android.apps.maps") // Attempt to start an activity that can handle the Intent startActivity(mapIntent)
Jeśli system nie może zidentyfikować aplikacji, która może odpowiedzieć na intencję, aplikacja może się zawiesić. Dlatego zanim przedstawisz użytkownikowi jeden z tych intencji, musisz najpierw sprawdzić, czy aplikacja odbiorcza jest zainstalowana.
Aby sprawdzić, czy aplikacja może odebrać intencję, wywołaj funkcję resolveActivity()
na obiekcie Intent
. Jeśli wynik jest inny niż null, istnieje co najmniej 1 aplikacja, która może obsłużyć ten zamiar, i można go bezpiecznie wywołać.startActivity()
Jeśli wynik to null
, nie używaj tej intencji. Jeśli to możliwe, wyłącz funkcję, która wywołuje tę intencję.
Java
if (mapIntent.resolveActivity(getPackageManager()) != null) { ... }
Kotlin
mapIntent.resolveActivity(packageManager)?.let { ... }
Aby wyświetlić mapę San Francisco, możesz użyć tego kodu:
Java
Uri gmmIntentUri = Uri.parse("geo:37.7749,-122.4194"); Intent mapIntent = new Intent(Intent.ACTION_VIEW, gmmIntentUri); mapIntent.setPackage("com.google.android.apps.maps"); if (mapIntent.resolveActivity(getPackageManager()) != null) { startActivity(mapIntent); }
Kotlin
val gmmIntentUri = Uri.parse("geo:37.7749,-122.4194") val mapIntent = Intent(Intent.ACTION_VIEW, gmmIntentUri) mapIntent.setPackage("com.google.android.apps.maps") mapIntent.resolveActivity(packageManager)?.let { startActivity(mapIntent) }
ciągi tekstowe zapytań zakodowane w adresie URL;
Wszystkie ciągi przekazywane do Map Google Intents muszą być zakodowane w formacie URI. Na przykład ciąg znaków „1st & Pike, Seattle” powinien zostać zastąpiony przez 1st%20%26%20Pike%2C%20Seattle
.
Spacje w ciągu można zakodować za pomocą znaku %20 lub zastąpić znakiem plusa (+).
Do kodowania ciągów znaków możesz użyć metody android.net.Uri
parse()
.
Na przykład:
Java
Uri gmmIntentUri = Uri.parse("geo:37.7749,-122.4192?q=" + Uri.encode("1st & Pike, Seattle"));
Kotlin
val gmmIntentUri = Uri.parse("geo:37.7749,-122.4192?q=" + Uri.encode("1st & Pike, Seattle"))
Wyświetlanie mapy
Użyj intencji geo:
, aby wyświetlić mapę w określonej lokalizacji i poziomie powiększenia.
geo:latitude,longitude?z=zoom
Parametry
latitude
ilongitude
ustawiają punkt środkowy mapy.z
opcjonalnie ustawia początkowy poziom powiększenia mapy. Akceptowane wartości wahają się od 0 (cały świat) do 21 (poszczególne budynki). Górna granica może się różnić w zależności od danych mapy dostępnych w wybranej lokalizacji.
Przykłady
Java
// Creates an Intent that will load a map of San Francisco Uri gmmIntentUri = Uri.parse("geo:37.7749,-122.4194"); Intent mapIntent = new Intent(Intent.ACTION_VIEW, gmmIntentUri); mapIntent.setPackage("com.google.android.apps.maps"); startActivity(mapIntent);
Kotlin
// Creates an Intent that will load a map of San Francisco val gmmIntentUri = Uri.parse("geo:37.7749,-122.4194") val mapIntent = Intent(Intent.ACTION_VIEW, gmmIntentUri) mapIntent.setPackage("com.google.android.apps.maps") startActivity(mapIntent)
Wyszukiwanie lokalizacji
Używaj tego zamiaru, aby wyświetlać zapytania w określonym widoku. Gdy zapytanie ma jeden wynik, możesz użyć tego zamiaru, aby wyświetlić pin w określonym miejscu lub pod określonym adresem, np. w miejscu charakterystycznym, firmie, obiekcie geograficznym lub mieście.
geo:latitude,longitude?q=query geo:0,0?q=my+street+address geo:0,0?q=latitude,longitude(label)
Parametry
Oprócz parametrów służących do wyświetlania mapy wyszukiwarka obsługuje te parametry:
q
określa miejsca, które mają być wyróżnione na mapie. Parametrq
jest wymagany w przypadku wszystkich żądań wyszukiwania. Może to być nazwa lub adres miejsca. Ciąg powinien być zakodowany w adresie URL, więc adres taki jak „Urząd Miasta, Warszawa, Mazowieckie” powinien zostać przekonwertowany na Urząd+Miasta,Warszawa,Mazowsze.label
umożliwia ustawienie etykiety własnej w miejscu wskazanym na mapie. Wartośćlabel
musi być podana jako ciąg znaków.
Wyszukiwanie według kategorii
Jeśli podasz ogólne hasło wyszukiwania, Mapy Google spróbują znaleźć lokalizację w pobliżu podanych współrzędnych geograficznych, która spełnia Twoje kryteria. Jeśli nie zostanie określona lokalizacja, Mapy Google spróbują znaleźć informacje o miejscach w pobliżu. Na przykład:
Java
// Search for restaurants nearby Uri gmmIntentUri = Uri.parse("geo:0,0?q=restaurants"); Intent mapIntent = new Intent(Intent.ACTION_VIEW, gmmIntentUri); mapIntent.setPackage("com.google.android.apps.maps"); startActivity(mapIntent); // Search for restaurants in San Francisco Uri gmmIntentUri = Uri.parse("geo:37.7749,-122.4194?q=restaurants"); Intent mapIntent = new Intent(Intent.ACTION_VIEW, gmmIntentUri); mapIntent.setPackage("com.google.android.apps.maps"); startActivity(mapIntent);
Kotlin
// Search for restaurants nearby val gmmIntentUri = Uri.parse("geo:0,0?q=restaurants") val mapIntent = Intent(Intent.ACTION_VIEW, gmmIntentUri) mapIntent.setPackage("com.google.android.apps.maps") startActivity(mapIntent) // Search for restaurants in San Francisco val gmmIntentUri = Uri.parse("geo:37.7749,-122.4194?q=restaurants") val mapIntent = Intent(Intent.ACTION_VIEW, gmmIntentUri) mapIntent.setPackage("com.google.android.apps.maps") startActivity(mapIntent)
Możesz dodatkowo wpływać na wyniki wyszukiwania, podając parametr zoomu wraz z ciągiem zapytania. W przykładzie poniżej dodanie powiększenia 10 spowoduje, że restauracje będą wyszukiwane na poziomie miasta, a nie w pobliżu.
Java
Uri gmmIntentUri = Uri.parse("geo:37.7749,-122.4194?z=10&q=restaurants"); Intent mapIntent = new Intent(Intent.ACTION_VIEW, gmmIntentUri); mapIntent.setPackage("com.google.android.apps.maps"); startActivity(mapIntent);
Kotlin
val gmmIntentUri = Uri.parse("geo:37.7749,-122.4194?z=10&q=restaurants") val mapIntent = Intent(Intent.ACTION_VIEW, gmmIntentUri) mapIntent.setPackage("com.google.android.apps.maps") startActivity(mapIntent)
wyszukiwanie lokalizacji;
Wyszukiwanie konkretnego adresu spowoduje wyświetlenie w tym miejscu pinu.
Java
Uri gmmIntentUri = Uri.parse("geo:0,0?q=1600 Amphitheatre Parkway, Mountain+View, California"); Intent mapIntent = new Intent(Intent.ACTION_VIEW, gmmIntentUri); mapIntent.setPackage("com.google.android.apps.maps"); startActivity(mapIntent);
Kotlin
val gmmIntentUri = Uri.parse("geo:0,0?q=1600 Amphitheatre Parkway, Mountain+View, California") val mapIntent = Intent(Intent.ACTION_VIEW, gmmIntentUri) mapIntent.setPackage("com.google.android.apps.maps") startActivity(mapIntent)
W tym przykładzie ustawiono współrzędne lat/lng 0
,0
, ale adres jest przekazywany jako ciąg znaków zapytania. W przypadku wyszukiwania bardzo konkretnej lokalizacji współrzędne geograficzne nie są wymagane. Jeśli jednak nie znasz dokładnego adresu, możesz spróbować wpłynąć na wyniki wyszukiwania, podając współrzędne. Na przykład wyszukiwanie adresu „Ulica Główna” zwróci zbyt wiele wyników.
Java
// Searching for 'Main Street' will return too many results Uri gmmIntentUri = Uri.parse("geo:0,0?q=101+main+street");
Kotlin
// Searching for 'Main Street' will return too many results val gmmIntentUri = Uri.parse("geo:0,0?q=101+main+street")
Dodanie współrzędnych geograficznych do identyfikatora URI intencji spowoduje, że wyniki będą bardziej trafne w przypadku danego obszaru:
Java
// Searches for 'Main Street' near San Francisco Uri gmmIntentUri = Uri.parse("geo:37.7749,-122.4194?q=101+main+street"); Intent mapIntent = new Intent(Intent.ACTION_VIEW, gmmIntentUri); mapIntent.setPackage("com.google.android.apps.maps"); startActivity(mapIntent);
Kotlin
// Searches for 'Main Street' near San Francisco val gmmIntentUri = Uri.parse("geo:37.7749,-122.4194?q=101+main+street") val mapIntent = Intent(Intent.ACTION_VIEW, gmmIntentUri) mapIntent.setPackage("com.google.android.apps.maps") startActivity(mapIntent)
Jeśli wiesz, że wyszukiwanie zwróci jedną wartość, możesz przekazać opcjonalną etykietę. Etykiety muszą być podawane jako ciągi znaków i wyświetlane pod znacznikiem mapy. Pamiętaj, że etykiety są dostępne tylko wtedy, gdy q
jest określony jako współrzędna lat/lng.
Java
// Display a label at the location of Google's Sydney office Uri gmmIntentUri = Uri.parse("geo:0,0?q=Google+Sydney@-33.8666,151.1957"); Intent mapIntent = new Intent(Intent.ACTION_VIEW, gmmIntentUri); mapIntent.setPackage("com.google.android.apps.maps"); startActivity(mapIntent);
Kotlin
// Display a label at the location of Google's Sydney office val gmmIntentUri = Uri.parse("geo:0,0?q=-33.8666,151.1957(Google+Sydney)") val mapIntent = Intent(Intent.ACTION_VIEW, gmmIntentUri) mapIntent.setPackage("com.google.android.apps.maps") startActivity(mapIntent)
Zamiast adresu ulicznego lub współrzędnych geograficznych możesz wyświetlić pin w znanej lokalizacji za pomocą kodu Plus Code.
Java
// Display the location of Google, San Francisco using a global plus code. Uri gmmIntentUri = Uri.parse("http://plus.codes/849VQJQ5+XX"); // Equivalently, define the same location using a local plus code gmmIntentUri = Uri.parse("https://plus.codes/QJQ5+XX,San%20Francisco"); // Construct and use the Intent as in the examples above
Kotlin
// Display the location of Google, San Francisco using a global plus code. var gmmIntentUri = Uri.parse("http://plus.codes/849VQJQ5+XX") // Equivalently, define the same location using a local plus code gmmIntentUri = Uri.parse("https://plus.codes/QJQ5+XX,San%20Francisco") // Construct and use the Intent as in the examples above
Uruchamianie nawigacji zakręt po zakrętem
Użyj tej intencji, aby uruchomić nawigację w Mapach Google ze szczegółowymi wskazówkami dojazdu do określonego adresu lub współrzędnych. Wskazówki dojazdu są zawsze podawane z obecnej lokalizacji użytkownika.
google.navigation:q=a+street+address google.navigation:q=latitude,longitude
Parametry
q
: ustawia punkt docelowy dla wyszukiwań nawigacyjnych. Ta wartość może być współrzędnymi szerokości i długości geograficznej lub adresem w formacie zapytania. Jeśli jest to ciąg znaków zapytania, który zwraca więcej niż 1 wynik, zostanie wybrany pierwszy wynik.mode
określa sposób transportu. Tryb jest opcjonalny i może być ustawiony na jeden z tych trybów:d
samochodem (domyślnie)b
na rowerzel
motocyklemw
na spacery
avoid
określa cechy, których trasa powinna unikać. Opcja unikania jest opcjonalna i może być ustawiona na jeden z tych elementów:t
za opłaty drogoweh
na autostradachf
promów
Przykłady
Poniższe Intent
poprosi o szczegółową nawigację do Taronga Zoo w Sydney w Australii:
Java
Uri gmmIntentUri = Uri.parse("google.navigation:q=Taronga+Zoo,+Sydney+Australia"); Intent mapIntent = new Intent(Intent.ACTION_VIEW, gmmIntentUri); mapIntent.setPackage("com.google.android.apps.maps"); startActivity(mapIntent);
Kotlin
val gmmIntentUri = Uri.parse("google.navigation:q=Taronga+Zoo,+Sydney+Australia") val mapIntent = Intent(Intent.ACTION_VIEW, gmmIntentUri) mapIntent.setPackage("com.google.android.apps.maps") startActivity(mapIntent)
Jeśli nie chcesz płacić za przejazd przez bramki lub nie chcesz korzystać z promu, możesz poprosić o wyznaczenie trasy, która ich uniknie.
Java
Uri gmmIntentUri = Uri.parse("google.navigation:q=Taronga+Zoo,+Sydney+Australia&avoid=tf"); Intent mapIntent = new Intent(Intent.ACTION_VIEW, gmmIntentUri); mapIntent.setPackage("com.google.android.apps.maps"); startActivity(mapIntent);
Kotlin
val gmmIntentUri = Uri.parse("google.navigation:q=Taronga+Zoo,+Sydney+Australia&avoid=tf") val mapIntent = Intent(Intent.ACTION_VIEW, gmmIntentUri) mapIntent.setPackage("com.google.android.apps.maps") startActivity(mapIntent)
Jeśli wolisz trochę się poruszać, możesz poprosić o wskazanie trasy rowerowej.
Java
Uri gmmIntentUri = Uri.parse("google.navigation:q=Taronga+Zoo,+Sydney+Australia&mode=b"); Intent mapIntent = new Intent(Intent.ACTION_VIEW, gmmIntentUri); mapIntent.setPackage("com.google.android.apps.maps"); startActivity(mapIntent);
Kotlin
val gmmIntentUri = Uri.parse("google.navigation:q=Taronga+Zoo,+Sydney+Australia&mode=b") val mapIntent = Intent(Intent.ACTION_VIEW, gmmIntentUri) mapIntent.setPackage("com.google.android.apps.maps") startActivity(mapIntent)
Jeśli wolisz korzystać z motocykla, możesz poprosić o to, aby trasa obejmowała wąskie drogi i ścieżki niedostępne dla samochodów. Poniższa wartość intent
zwraca trasę w Indiach.
Java
Uri gmmIntentUri = Uri.parse("google.navigation:q=Connaught+Place,+New+Delhi,Delhi&mode=l"); Intent mapIntent = new Intent(Intent.ACTION_VIEW, gmmIntentUri); mapIntent.setPackage("com.google.android.apps.maps"); startActivity(mapIntent);
Kotlin
val gmmIntentUri = Uri.parse("google.navigation:q=Connaught+Place,+New+Delhi,Delhi&mode=l") val mapIntent = Intent(Intent.ACTION_VIEW, gmmIntentUri) mapIntent.setPackage("com.google.android.apps.maps") startActivity(mapIntent)
Wyświetlanie panoramy Street View
Aby uruchomić Google Street View, użyj intencjonalnego polecenia google.streetview
. Google Street View zapewnia widoki panoramiczne z wybranych miejsc w obszarze.
Dostępne są też Photosphere przesłane przez użytkowników i specjalne kolekcje Street View.
google.streetview:cbll=latitude,longitude&cbp=0,bearing,0,zoom,tilt google.streetview:panoid=id&cbp=0,bearing,0,zoom,tilt
Parametry
Wszystkie identyfikatory URI google.streetview
muszą zawierać parametr cbll
lub panoid
.
cbll
przyjmuje szerokość i długość geograficzną jako wartości rozdzielone przecinkami (46.414382,10.013988
). Aplikacja wyświetli panoramę sfotografowaną najbliżej tej lokalizacji. Zdjęcia Street View są okresowo aktualizowane, a zdjęcia mogą być robione z nieco innych pozycji, dlatego po aktualizacji zdjęć Twoja lokalizacja może się zmienić na inną panoramę.panoid
to identyfikator konkretnej panoramy. Jeśli podasz zarówno parametrpanoid
, jak icbll
, Mapy Google użyją identyfikatora panoramy. Identyfikatory panoramy są dostępne dla aplikacji na Androida z obiektuStreetViewPanoramaLocation
.cbp
to opcjonalny parametr, który dostosowuje początkową orientację kamery. Parametrcbp
może zawierać 5 wartości rozdzielonych przecinkami, z których wszystkie są opcjonalne. Najważniejsze wartości to druga, czwarta i piąta, które określają odpowiednio kierunek, powiększenie i przechylenie. Pierwsza i trzecia wartość nie są obsługiwane i powinny być ustawione na0
.bearing
: określa kierunek na kompasie, w którym zwrócona jest kamera, w stopniach w prawo od północy. Prawdziwa północ to 0, wschód to 90, południe to 180, a zachód to 270. Wartości przekazane do atrybutu bearing zostaną zawinięte, co oznacza, że 0°, 360° i 720° wskazują w tym samym kierunku. Kierunek jest zdefiniowany jako druga z 5 wartości rozdzielonych przecinkami.zoom
: określa poziom powiększenia kamery. Domyślny poziom powiększenia to 0. Powiększenie 1 podwaja powiększenie. Powiększenie jest ograniczone do zakresu od 0 do maksymalnego powiększenia bieżącej panoramy. Oznacza to, że każda wartość spoza tego zakresu zostanie ustawiona na najbliższą wartość skrajną, która mieści się w tym zakresie. Na przykład wartość –1 zostanie ustawiona na 0. Zoom to czwarta z 5 wartości rozdzielonych przecinkami.tilt
: określa kąt, w którym skierowana jest kamera (w górę lub w dół). Zakres wynosi od -90 do 90, przy czym 90 oznacza widok w dół, 0 – widok na horyzont, a -90 – widok w górę.
Przykłady
Poniżej znajdziesz kilka przykładów użycia intencji związanej ze Street View.
Java
// Displays an image of the Swiss Alps Uri gmmIntentUri = Uri.parse("google.streetview:cbll=46.414382,10.013988"); Intent mapIntent = new Intent(Intent.ACTION_VIEW, gmmIntentUri); mapIntent.setPackage("com.google.android.apps.maps"); startActivity(mapIntent); // Uses a PanoID to show an image from Maroubra beach in Sydney, Australia Uri gmmIntentUri = Uri.parse("google.streetview:panoid=Iaa2JyfIggYAAAQfCZU9KQ"); Intent mapIntent = new Intent(Intent.ACTION_VIEW, gmmIntentUri); mapIntent.setPackage("com.google.android.apps.maps"); startActivity(mapIntent); // Opens Street View between two Pyramids in Giza. The values passed to the // cbp parameter will angle the camera slightly up, and towards the east. Uri gmmIntentUri = Uri.parse("google.streetview:cbll=29.9774614,31.1329645&cbp=0,30,0,0,-15"); Intent mapIntent = new Intent(Intent.ACTION_VIEW, gmmIntentUri); mapIntent.setPackage("com.google.android.apps.maps"); startActivity(mapIntent);
Kotlin
// Displays an image of the Swiss Alps val gmmIntentUri = Uri.parse("google.streetview:cbll=46.414382,10.013988") val mapIntent = Intent(Intent.ACTION_VIEW, gmmIntentUri) mapIntent.setPackage("com.google.android.apps.maps") startActivity(mapIntent) // Uses a PanoID to show an image from Maroubra beach in Sydney, Australia val gmmIntentUri = Uri.parse("google.streetview:panoid=Iaa2JyfIggYAAAQfCZU9KQ") val mapIntent = Intent(Intent.ACTION_VIEW, gmmIntentUri) mapIntent.setPackage("com.google.android.apps.maps") startActivity(mapIntent) // Opens Street View between two Pyramids in Giza. The values passed to the // cbp parameter will angle the camera slightly up, and towards the east. val gmmIntentUri = Uri.parse("google.streetview:cbll=29.9774614,31.1329645&cbp=0,30,0,0,-15") val mapIntent = Intent(Intent.ACTION_VIEW, gmmIntentUri) mapIntent.setPackage("com.google.android.apps.maps") startActivity(mapIntent)