Aplikacja Mapy Google na Androida udostępnia kilka intencji, które pozwalają uruchomić Mapy Google w trybach wyświetlania, wyszukiwania, nawigacji i Street View. Jeśli chcesz umieścić mapę w swojej aplikacji, zapoznaj się z wprowadzeniem do interfejsu API Map Google na Androida.
Przegląd
Intencje umożliwiają rozpoczęcie działania w innej aplikacji przez opisanie prostego działania, które chcesz wykonać (np. „wyświetlenie mapy” lub „pokaż trasę do lotniska”) w obiekcie Intent
. Aplikacja Mapy Google na Androida obsługuje kilka różnych intencji, dzięki czemu możesz uruchomić aplikację Mapy Google i wykonać jedną z czterech czynności:
- Możesz wyświetlić mapę w określonej lokalizacji i na poziomie powiększenia.
- Wyszukaj lokalizacje lub miejsca i wyświetl je na mapie.
- Uzyskiwanie wskazówek dojazdu z jednego miejsca do drugiego. Trasa dojazdu może zostać zwrócona dla trzech środków transportu: samochodem, pieszo i rowerem.
- Wyświetl zdjęcia panoramiczne w Google Street View.
Na tej stronie opisujemy intencje, których można używać w aplikacji Mapy Google na Androida. Więcej informacji o filtrach intencji i intencji oraz intencjach wspólnych dla platformy Androida znajdziesz w dokumentacji dla programistów aplikacji na Androida.
Żądania intencji
Aby uruchomić Mapy Google z intencją, musisz najpierw utworzyć obiekt Intent
z jego działaniem, identyfikatorem URI i pakietem.
- Działanie: wszystkie intencje w Mapach Google są nazywane „działaniem wyświetlenia” –
ACTION_VIEW
. - Identyfikator URI: intencje Map Google używają zakodowanego adresu URL, który określa oczekiwane działanie oraz dane, na podstawie których ma ono zostać wykonane.
- Pakiet: wywołanie
setPackage("com.google.android.apps.maps")
upewnia się, że aplikacja Mapy Google na Androida obsługuje intencję. Jeśli pakiet nie jest skonfigurowany, system określi, które aplikacje mogą obsłużyć plikIntent
. Jeśli dostępnych jest wiele aplikacji, użytkownik może zostać zapytany, której z nich chce użyć.
Po utworzeniu Intent
możesz na kilka sposobów poprosić system o uruchomienie powiązanej aplikacji. Popularną metodą jest przekazanie Intent
do metody startActivity()
. System uruchomi niezbędną aplikację (w tym przypadku Mapy Google) i uruchomi odpowiednią aplikację 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 znajdzie aplikacji, która może zareagować na intencję, może dojść do awarii aplikacji. Z tego względu przed zaprezentowaniem użytkownikowi jednego z tych intencji musisz sprawdzić, czy jest zainstalowana aplikacja odbierająca.
Aby sprawdzić, czy aplikacja może odbierać intencję, wywołaj metodę resolveActivity()
w obiekcie Intent
. Jeśli wynik nie ma wartości null, istnieje co najmniej 1 aplikacja, która może obsłużyć zamiar i można bezpiecznie wywołać metodę startActivity()
.
Jeśli wynik to null
, nie używaj intencji i – jeśli to możliwe – wyłącz funkcję, która wywołuje intencję.
Java
if (mapIntent.resolveActivity(getPackageManager()) != null) { ... }
Kotlin
mapIntent.resolveActivity(packageManager)?.let { ... }
Aby na przykład wyświetlić mapę San Francisco, możesz użyć następującego 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 zapytania zakodowane w adresie URL
Wszystkie ciągi znaków przekazywane do intencji Map Google muszą być zakodowane za pomocą identyfikatora URI. Na przykład ciąg „1st & Pike, Seattle” powinien wyglądać tak: 1st%20%26%20Pike%2C%20Seattle
.
Spacje w ciągu można zakodować za pomocą %20 lub zastąpić znakiem plusa (+).
Do zakodowania ciągów tekstowych 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 na 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 mieszczą się w zakresie od 0 (cały świat) do 21 (pojedyncze budynki). Górny limit 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żyj tej intencji, aby wyświetlać wyszukiwane hasła w określonym widocznym obszarze. Jeśli zapytanie zwróci pojedynczy wynik, możesz użyć tej intencji, aby wyświetlić pinezkę w konkretnym miejscu lub adresie, np. punkt orientacyjny, firma, obiekt geograficzny lub miejscowość.
geo:latitude,longitude?q=query geo:0,0?q=my+street+address geo:0,0?q=latitude,longitude(label)
Parametry
Oprócz parametrów używanych do wyświetlania mapy wyszukiwarka obsługuje te parametry:
q
określa miejsca do wyróżnienia na mapie. Parametrq
jest wymagany w przypadku wszystkich żądań wyszukiwania. Akceptuje lokalizację jako nazwę lub adres. Ciąg powinien być zakodowany w adresie URL, więc adres taki jak „City Hall, New York, NY” powinien zostać przekonwertowany na „City+Hall,New+York,”label
umożliwia ustawienie własnej etykiety w miejscu wskazanym na mapie. Polelabel
musi być określone jako ciąg znaków.
Wyszukiwanie kategorialne
Jeśli przekażesz ogólne wyszukiwane hasło, Mapy Google spróbują znaleźć lokalizację w pobliżu podanej szerokości i długości geograficznej, która odpowiada Twoim kryteriom. Jeśli nie podasz lokalizacji, Mapy Google spróbują znaleźć pobliskie wizytówki. 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)
Aby jeszcze bardziej uprzedzać wyniki wyszukiwania, określ parametr zoom i ciąg zapytania. W przykładzie poniżej dodanie powiększenia o 10 spowoduje próbę znalezienia restauracji 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
Wyszukanie konkretnego adresu spowoduje wyświetlenie pinezki w tym miejscu.
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 można ustawić szerokość i długość geograficzną 0
,0
, ale adres przekazuje adres jako ciąg zapytania. Przy wyszukiwaniu konkretnej lokalizacji nie trzeba podawać szerokości i długości geograficznej. Jeśli jednak nie znasz dokładnego adresu, możesz spróbować zniekształcić wyniki wyszukiwania przez określenie współrzędnych. Na przykład wyszukanie 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 szerokości i długości geograficznej do identyfikatora URI intencji spowoduje zniekształcenie wyników w kierunku określonego 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 1 wartość, możesz przekazać opcjonalną etykietę. Etykiety muszą być określone jako ciąg znaków. Będą one widoczne pod znacznikiem mapy. Pamiętaj, że etykiety są dostępne tylko wtedy, gdy q
jest określony jako współrzędna dł./szerokości geograficznej.
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 lub szerokości i długości geograficznej możesz wyświetlić pinezkę w znanej lokalizacji wraz z kodem plusa.
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
Uruchamiam nawigację zakręt po zakręcie
Dzięki temu możesz 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 bieżącej lokalizacji użytkownika.
google.navigation:q=a+street+address google.navigation:q=latitude,longitude
Parametry
q
: ustawia punkt końcowy wyszukiwania nawigacji. Może to być szerokość i długość geograficzna lub adres w formacie zapytania. Jeśli jest to ciąg zapytania, który zwraca więcej niż 1 wynik, wybierany jest pierwszy wynik.mode
ustawia środek transportu. Tryb jest opcjonalny i można go ustawić na jeden z tych:d
do jazdy samochodem (domyślnie)b
dla rowerówl
dla motocyklaw
do trasy pieszej
avoid
określa miejsca, których trasa powinna unikać. Opcja „Unikaj” jest opcjonalna i można ją ustawić na co najmniej 1 z tych opcji:t
za opłatyh
przy autostradachf
za promy
Przykłady
Użytkownik Intent
poniżej poprosi o szczegółowe wskazówki dojazdu do zoo Taronga 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ć opłat drogowych ani korzystać z promów, możesz poprosić o trasę, która pozwoli uniknąć tych opłat.
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 poćwiczyć, możesz poprosić o wskazówki dojazdu rowerem.
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 pojechać motocyklem z silnikiem, możesz poprosić o uwzględnienie wąskich dróg i szlaków niedostępnych dla samochodów. intent
poniżej 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 intencji google.streetview
. Google Street View zapewnia panoramiczne widoki z wyznaczonych lokalizacji na całym obszarze zasięgu.
Dostępne są też zdjęcia sferyczne 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 obiektu google.streetview
muszą zawierać parametr cbll
lub panoid
.
cbll
jako szerokość i długość geograficzną jako wartości rozdzielone przecinkami (46.414382,10.013988
). Aplikacja wyświetli panoramę sfotografowaną najbliżej tego miejsca. Zdjęcia Street View są okresowo odświeżane i za każdym razem mogą zostać wykonane z nieco innych pozycji, dlatego podczas aktualizowania zdjęć lokalizacja może zostać ustawiona na inną panoramę.panoid
to identyfikator konkretnej panoramy. Mapy Google będą używać identyfikatora panoramy, jeśli określisz zarównopanoid
, jak icbll
. Identyfikatory panoram są dostępne dla aplikacji na Androida z obiektuStreetViewPanoramaLocation
.cbp
to opcjonalny parametr, który dostosowuje początkową orientację kamery. Parametrcbp
ma 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 przesunięcie, powiększenie i pochylenie. Pierwsza i trzecia wartość nie są obsługiwane i powinny być ustawione na0
.bearing
: wskazuje kierunek kompasu w stopniach w kierunku zgodnym z ruchem wskazówek zegara, od północy. Rzeczywista północ to 0, wschód to 90, południe to 180, a zachód to 270. Wartości przekazane do kierunku zawijają się, czyli wszystkie punkty w kierunkach 0°, 360° i 720° są zawijane. Ocena to druga z pięciu wartości rozdzielonych przecinkami.zoom
: ustawia poziom powiększenia kamery. Domyślny poziom powiększenia jest ustawiony na 0. Powiększenie 1 spowodowałoby dwukrotne zwiększenie powiększenia. Powiększenie jest zmniejszane do wartości od 0 do maksymalnego poziomu dla bieżącej panoramy. Oznacza to, że każda wartość wykraczająca poza ten zakres jest ustawiana na najbliższą ekstremalną wartość mieszczącą się w danym zakresie. Na przykład wartość -1 zostanie ustawiona na 0. Powiększenie jest czwartą z 5 wartości rozdzielonych przecinkami.tilt
: określa kąt obrotu kamery (w górę lub w dół). Zakres wynosi od -90 do 90, przy czym 90 wygląda prosto w dół, 0 na horyzoncie, a -90 na horyzoncie.
Przykłady
Poniżej znajdziesz kilka przykładów wykorzystania intencji 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)