2010-04-18 2 views
308

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

ответ

520

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

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 для универсальных, кросс-платформенных Google Maps URL-адресов:

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

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

+9

Есть ли способ удалить диалог ??? и пусть это будет просто приложение карты – molleman

+2

Не то, чтобы я знал. Тем не менее, диалог не будет, если пользователь уже выбрал приложение по умолчанию, чтобы открыть этот тип намерений в качестве приложения карты. –

+103

Если вы хотите избавиться от диалога, вы можете дать намек на какой пакет вы хотите использовать. Перед startActivity() добавьте это: 'intent.setClassName (" com.google.android.apps.maps "," com.google.android.maps.MapsActivity ");' –

110

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

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

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

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

Если вы используете параметр запроса «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); 

NOTE (by @TheNail): Не работает в Maps v.7 (последняя версия на момент написания). Будет игнорировать координаты и искать объект с заданным именем между круглыми скобками. См. Также Intent for Google Maps 7.0.0 with location

+3

Ницца, по умолчанию гео: 0,0 просто перемещает карту там. Это решение ["geo: 0,0? q = 37.423156, -122.084917 (" + name + ")"] позволяет указать собственное имя маркера. – gnac

+0

Выше также работает с Uri.parse ("geo: 0,0? q = custom + address (" + name + ")") Exactl Я хочу, чтобы я хотел. Благодарю. – anargund

+3

Работает отлично - fyi не работает в сочетании с параметром запроса «z» (уровень масштабирования) – scolestock

0

Если вы знаете точку 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); 

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

Примечание: в этом примере используется образец файла, который (по состоянию mar13) до сих пор в Интернете.если он отключен, найдите файл kml онлайн и измените свой url

+1

При нажатии кнопки «Назад» из приложения «Карты» появляется черный экран, и основная деятельность воссоздается. Любая идея, как это исправить? – Jas

+0

@Jas, google изменил множество своих API, и это поведение, возможно, изменилось. Я использую открытые уличные карты исключительно в течение довольно долгого времени, поэтому я был бы в состоянии помочь вам. :) –

77

Хотя текущие ответы велики, ни один из них не совсем то, что я искал, я хотел открыть только приложение для карт, добавить имя для каждое из местоположений источника и адресата, используя схему географического 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); 
Intent mapIntent = new Intent(Intent.ACTION_VIEW, navigationIntentUri); 
mapIntent.setPackage("com.google.android.apps.maps"); 
startActivity(mapIntent); 
+2

Это отличный ответ Дэвиду! Также вы знаете, как действительно начать навигацию в навигационном приложении? В текущем состоянии пользователь должен нажать «Начать навигацию» в последний раз. Я искал Google для любого передаваемого параметра, но не смог найти. – Nirmal

+0

Можем ли мы добавить окно с информацией о марке на его клике? –

+0

При нажатии кнопки «Назад» из приложения карт отображается черный экран, и основная деятельность воссоздается. Любая идея, как исправить это? – Jas

2

попробовать этот

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

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

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

  • Действие
  • 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); 
    } 
+0

Использование Uri.Builder работает только для абсолютных URI, в форме:' : // ? # ', а не непрозрачные URI' : # '. Вышеприведенный код дает следующий URI: 'geo:/0% 2C0? Eiffel% 20Tower', который приводит к сбою приложения Google Maps. Даже [официальная документация] (https://developers.google.com/maps/documentation/android-api/intents) использует исходные/непрозрачные URI по этой самой причине. Тогда правильный код будет следующим: 'Uri.parse (« geo: 0,0? Q = »+ Uri.encode (« Эйфелева башня »)) – bitek

+0

Также см. Этот ответ для объяснения причин, почему ваш ответ не работает : http://stackoverflow.com/a/12035226/313113 – bitek

2

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

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.

+0

Не работает, вы не можете помочь? –

+0

Что не работает? Что вы видите при выполнении этого точного кода? –

+0

На самом деле не используйте точные координаты, которые я здесь помещаю. Они находятся в середине нигде где-то без дорог, так что это не сработает. –

2

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

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

Используя последние кросс-платформенных Google Maps URL-: Даже если 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); 
0

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

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

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

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 for Android

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

отличная! Я думаю, что ваш ответ должен быть первым с момента появления нового API. – Mogi

Смежные вопросы