Uruchamianie Google Maps na Androidzie

Moja aplikacja musi pokazywać Google Maps kierunki od A do B, ale nie chcę umieszczać Google Maps w mojej aplikacji - zamiast tego chcę uruchomić go za pomocą intencji. Czy to możliwe? Jeśli tak, to w jaki sposób?

Author: Reg Edit, 2010-04-18

13 answers

Przydałoby się coś 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ę z bieżącej lokalizacji, Usuń parametr i wartość saddr.

Możesz użyć rzeczywistego adresu ulicy zamiast szerokości i długości geograficznej. Jednak da to użytkownikowi okno dialogowe do wyboru między otwarciem go przez przeglądarkę lub Google Maps.

To uruchomi Google Maps w trybie nawigacji bezpośrednio:

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

UPDATE

[[3]} w maju 2017 roku Google uruchomiło nowe API dla uniwersalny, wieloplatformowy adres URL Google Maps:

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

Możesz używać Intentów również z nowym API.

 556
Author: Jan S.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 14:54:11

Jest to trochę off-topic, 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: latitude,longitude" polega na tym, że Google Maps skupia się tylko w Twoim punkcie, bez żadnego kodu pin lub etykiety.

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

Jeśli używasz parametr zapytania " geo: lat,lon?q = nazwa " aby oznaczyć swój geopoint, wykorzystuje zapytanie do wyszukiwania i odrzucenia parametrów lat / lon.

Znalazłem sposób, aby wyśrodkować mapę za pomocą lat/lon i wyświetlić pin z niestandardową etykietą, bardzo ładny w wyświetlaniu i przydatny przy pytaniu 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 (by @ TheNail): nie działa w Maps V. 7 (najnowsza wersja w momencie pisania). Zignoruje współrzędne i wyszukuje obiekt o podanej nazwie między nawiasami. Zobacz też Intent dla Google Maps 7.0.0 z lokalizacją

 113
Author: Murphy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:10:42

Chociaż obecne odpowiedzi są świetne, żaden z nich nie zrobił dokładnie to, czego szukałem, chciałem otworzyć aplikację maps tylko, dodać nazwę dla każdego z lokalizacji źródłowej i docelowej, za pomocą schematu geo URI nie działa dla mnie w ogóle i map link nie miał etykiet, więc wymyśliłem to rozwiązanie, które jest zasadniczo połączeniem innych rozwiązań i komentarzy tutaj, mam nadzieję, że jest to pomocne dla innych oglą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 wykorzystać swój obecny lokalizacja jako punkt wyjścia (niestety nie znalazłem sposobu na oznaczenie bieżącej lokalizacji) następnie użyj następującego

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 maps, to dobrym pomysłem będzie złapanie ActivityNotFoundException, a następnie możemy rozpocząć aktywność ponownie Bez ograniczeń aplikacji maps, możemy być prawie pewni, że nigdy nie dojdziemy do toastu na końcu, ponieważ przeglądarka internetowa jest ważną aplikacją do uruchomienia tego schematu url też.

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

P. S. Wszelkie szerokości i długości użyte w moim przykładzie nie są reprezentatywne dla mojej lokalizacji, wszelkie podobieństwo do prawdziwej lokalizacji jest czystym zbiegiem okoliczności, aka nie jestem z Afryki: P

EDIT:

Dla kierunków, zamiar nawigacji jest teraz obsługiwany przez google.nawigacja

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);
 83
Author: David Thompson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-10-02 13:56:56
Uri.Builder directionsBuilder = new Uri.Builder()
        .scheme("https")
        .authority("www.google.com")
        .appendPath("maps")
        .appendPath("dir")
        .appendPath("")
        .appendQueryParameter("api", "1")
        .appendQueryParameter("destination", lat + "," + lon);

startActivity(new Intent(Intent.ACTION_VIEW, directionsBuilder.build()));
 19
Author: Igor Bubelov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-30 12:26:45

Korzystanie z najnowszych wieloplatformowych adresów URL Google Maps : Nawet jeśli brakuje aplikacji Google maps, otworzy się ona 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);
 12
Author: lakshman sai,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-05 09:35:15

Cóż, możesz spróbować otworzyć wbudowaną aplikację Android Maps za pomocą metody Intent.setClassName.

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);
 7
Author: Jonathan Caceres Romero,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-03-07 07:52:28

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);
 2
Author: Vijay Web Solutions,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-12-16 12:12:23

Dla punktów wielokrotnych, następujące mogą być również używane.

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 zbiór współrzędnych to miejsce startu. Wszystkie następne są punktami drogi, wykreślona trasa przechodzi.

Po prostu dodawaj punkty drogi, łącząc "/ Szerokość, Długość geograficzna " na końcu. Istnieje najwyraźniej limit 23 punktów drogi według Google docs . Nie jestem pewien, czy dotyczy to również Androida.

 2
Author: Adeel Tariq,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:05:21

To mi się udało:

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);
}
 2
Author: JediCate,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-27 15:37:53

Jeśli jesteś zainteresowany pokazaniem szerokości i długości geograficznej od 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ć . Możesz podać szerokość i długość docelową tutaj:

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 pokazać poprzez lokalizację, użyj:

google.navigation:q=a+street+address

Więcej informacji tutaj: Google Maps Intents for Android

 2
Author: WannaBeGeek,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-07 18:32:28

Jeśli znasz punkt A, punkt B (I jakiekolwiek funkcje lub ścieżki pomiędzy nimi) możesz użyć pliku KML wraz z 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 this SO answer

Uwaga: Ten przykład używa przykładowego pliku, który (od mar13) jest nadal online. jeśli plik został wyłączony, znajdź plik kml online i zmień adres url

 1
Author: tony gil,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:26:27

Google DirectionsView z lokalizacją źródłową jako bieżącą lokalizacją i lokalizacją docelową jako ciąg znaków

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

W powyższym destinationCityName jest ciąg varaiable zmodyfikował go zgodnie z wymaganiami.

 1
Author: Ramesh kumar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-07 13:32:01

Najpierw musisz teraz, gdy możesz użyć ukrytej intencji, dokumentacja Androida dostarcza nam bardzo szczegółowych wspólnych intencji aby zaimplementować intencję mapy, musisz utworzyć nową intencję z dwoma parametrami

  • Akcja
  • Uri

Do działania możemy użyć Intent.ACTION_VIEW A Dla Uri powinniśmy go zbudować, poniżej załączam 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);
    }
 0
Author: Bachiri Taoufiq Abderrahman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-21 13:54:38