Odpowiedzi:
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ń saddr
parametr 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.
intent.setClassName("com.google.android.apps.maps", "com.google.android.maps.MapsActivity");
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ą
geo:37.423156,-122.084917?q=37.423156,-122.084917 ...
?
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);
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);
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ą:
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 .
Możesz spróbować otworzyć wbudowaną aplikację Android Maps, korzystając z tej Intent.setClassName
metody.
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);
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.
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
mapIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
Google DirectionsView
z 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 destinationCityName
znajduje się zmienny ciąg znaków, w zależności od potrzeb.
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);
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
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
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);
}
<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%20Tower
co 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"))
Ł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
})
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);
}
}
});