Запуск Google Maps Directions через намерение на Android - PullRequest
371 голосов
/ 18 апреля 2010

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

Ответы [ 13 ]

596 голосов
/ 18 апреля 2010

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

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 Maps.

Это приведет к запуску 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:

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

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

117 голосов
/ 13 декабря 2010

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

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

Проблема, связанная с использованием «гео: широта, долгота», заключается в том, что Карты Google центрируются только в вашей точке без какого-либо булавки или метки.

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

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

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

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

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

93 голосов
/ 03 октября 2013

Хотя текущие ответы великолепны, ни один из них не сделал то, что я искал, я хотел открыть только приложение карт, добавить имя для каждого исходного местоположения и пункта назначения, используя схему гео 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, тогда мы сможем начать действие снова без ограничения приложения карт, мы можем быть уверены, что мы никогда не попадет на тост в конце, так как интернет-браузер является допустимым приложением для запуска этой схемы 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();
            }
        }

P.S. Любые широты или долготы, использованные в моем примере, не являются репрезентативными для моего местоположения, любое сходство с истинным местоположением является чистым совпадением, иначе я не из Африки: P

EDIT:

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

Использование последних кроссплатформенных 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);
7 голосов
/ 07 марта 2015

Ну, вы можете попробовать открыть встроенное приложение 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);
4 голосов
/ 07 августа 2017

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

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

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

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 Intents для Android

4 голосов
/ 16 мая 2017

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

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

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

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

3 голосов
/ 22 ноября 2018

Открыть 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" для велосипеда.

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

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

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

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

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

3 голосов
/ 07 июня 2018

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 это строка, изменяемая по мере необходимости.

3 голосов
/ 27 мая 2017

Вот что у меня сработало:

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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...