Запуск Google Maps Directions через намерение Android

Мое приложение должно показывать маршруты Google Maps от A до B, но я не хочу помещать Карты Google в свое приложение, вместо этого я хочу запустить его с помощью Intent. Это возможно? Если да, то как?

Ответ 1

Вы можете использовать что-то вроде этого:

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

Чтобы начать навигацию с текущего местоположения, удалите параметр и значение saddr.

Вы можете использовать фактический адрес улицы вместо широты и долготы. Однако это даст пользователю диалог выбора между его открытием через браузер или Карты Google.

Это приведет к немедленному запуску Google Maps в режиме навигации:

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

UPDATE

В мае 2017 года Google запустил новый API для универсальных межплатформенных URL-адресов Google Maps:

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

Вы также можете использовать Intents с новым API.

Ответ 2

Это немного не по теме, потому что вы просили "направления", но вы также можете использовать схему Geo URI, описанную в Документации для Android:

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

Проблема с использованием "geo: широта, долгота" заключается в том, что Google Maps ориентируется только на вашу точку, без каких-либо выводов или ярлыков.

Это довольно запутанно, особенно если вам нужно указать точное место или/и спросить о направлениях.

Если вы используете параметр запроса "geo: lat, lon? q = name", чтобы пометить ваш геосайт, он использует запрос для поиска и отклоняет параметры lat/lon.

Я нашел способ центрировать карту с помощью lat/lon и отображать вывод с пользовательской меткой, очень приятно отображать и использовать при запросе указаний или любых других действий:

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

ПРИМЕЧАНИЕ (by @TheNail): Не работает в Maps v.7 (последняя версия на момент написания). Будет игнорировать координаты и искать объект с заданным именем между круглыми скобками. См. Также Предназначение для Google Maps 7.0.0 с местоположением

Ответ 3

Хотя текущие ответы великолепны, ни один из них не сделал то, что я искал, я хотел открыть только приложение карт, добавить имя для каждого исходного местоположения и пункта назначения, используя схему гео-URI для меня и вообще, на веб-ссылке на картах не было ярлыков, поэтому я придумала это решение, которое, по сути, представляет собой объединение других решений и комментариев, сделанных здесь, надеюсь, оно будет полезно для других, просматривающих этот вопрос.

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

Чтобы использовать ваше текущее местоположение в качестве отправной точки (к сожалению, я не нашел способа обозначить текущее местоположение), используйте следующее

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

Для полноты, если у пользователя нет установленного приложения карт, то было бы неплохо поймать исключение ActivityNotFoundException, тогда мы можем начать действие снова без ограничения приложения карт, мы можем быть уверены, что никогда не получим Toast в конце, так как интернет-браузер является допустимым приложением для запуска этой схемы 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 Любые широты или долготы, использованные в моем примере, не являются репрезентативными для моего местоположения, любое сходство с истинным местоположением является чистым совпадением, иначе я не из Африки: P

РЕДАКТИРОВАТЬ:

Для указаний теперь поддерживается навигация с помощью 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);

Ответ 4

Использование последних межплатформенных URL-адресов Карт Google: даже если приложение Google Maps отсутствует, оно откроется в браузере

Пример 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);

Ответ 5

Ну, вы можете попробовать открыть встроенное приложение Android Maps с помощью метода 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);

Ответ 6

Для многоточечных точек можно использовать и следующее.

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

Первый набор координат - это ваше начальное местоположение. Все следующие точки пути, построенный маршрут проходит.

Просто продолжайте добавлять точки пути, кончая "/широта, долгота" в конце. По-видимому, предел 23-х пунктов в соответствии с google docs. Не уверен, что это относится и к Android.

Ответ 7

Если вам интересно показывать широту и долготу в текущем направлении, вы можете использовать это:

Направления всегда указываются от текущего местоположения пользователей.

Следующий запрос поможет вам выполнить это. Вы можете передать широту и долготу назначения здесь:

google.navigation:q=latitude,longitude

Используйте выше:

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

Или, если вы хотите показать по местоположению, используйте:

google.navigation:q=a+street+address

Подробнее здесь: Google Maps намерения для Android

Ответ 8

Это то, что сработало для меня:

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

Ответ 9

Google DirectionsView с исходным местоположением в качестве текущего местоположения и местоположением назначения, заданным в виде строки

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

В вышеупомянутом destinationCityName есть переменная строка, измененная по мере необходимости.

Ответ 10

Откройте Google Карты, используя Intent с разными режимами:

Мы можем открыть приложение Google Maps, используя намерение:

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)

Здесь "mode = b" для велосипеда.

Мы можем установить режим вождения, ходьбы и езды на велосипеде, используя:

  • г для вождения
  • ш для прогулок
  • б для езды на велосипеде

Вы можете узнать больше о намерениях с Google Maps здесь.

Примечание: если нет маршрута для велосипеда/автомобиля/пешехода, он покажет вам "Не могу найти дорогу туда"

Вы можете проверить мой оригинальный ответ здесь.

Ответ 11

попробуйте это

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

Ответ 12

если вы знаете точку A, точку B (и любые функции или дорожки между ними), вы можете использовать KML файл вместе с вашими намерениями.

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

для получения дополнительной информации см. этот ответ SO

ПРИМЕЧАНИЕ. В этом примере используется пример файла, который (по состоянию на mar13) находится в режиме онлайн. если он отключен, найдите файл kml онлайн и измените свой URL

Ответ 13

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

Ответ 14

Сначала вам нужно теперь, чтобы вы могли использовать неявное намерение, документация по Android дает нам очень подробный общие намерения для реализации намерения карты вам нужно создать новое намерение с двумя параметрами

  • Действие
  • Uri

Для действия мы можем использовать Intent.ACTION_VIEW и для Uri мы должны построить его, ниже я приложил образец кода для создания, сборки, запуска активности.

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