Намерения Google Карт для Android

Приложение Google Maps для Android предоставляет несколько намерений, которые вы можете использовать для запуска Google Maps в режимах отображения, поиска, навигации или просмотра улиц. Если вы хотите встроить карту в свое приложение, обратитесь к Руководству по началу работы с Google Maps Android API .

Обзор

Намерения позволяют вам начать действие в другом приложении, описав простое действие, которое вы хотите выполнить (например, «отобразить карту» или «показать направление к аэропорту») в объекте Intent . Приложение Google Maps для Android поддерживает несколько различных намерений, что позволяет запускать приложение Google Maps и выполнять одно из четырех действий:

  1. Отображение карты в указанном месте и уровне масштабирования.
  2. Ищите местоположения или места и отображайте их на карте.
  3. Запросите направление из одного места в другое. Направления можно вернуть для трех видов транспорта: на машине, пешком, на велосипеде.
  4. Отображение панорамных изображений в Google Street View.

На этой странице описываются намерения, которые вы можете использовать с приложением Google Maps для Android. Дополнительные сведения о намерениях и фильтрах намерений или намерениях, общих для платформы Android , см. в документации для разработчиков Android.

Запросы намерений

Чтобы запустить Google Maps с намерением, вы должны сначала создать объект Intent , указав его действие, URI и пакет.

  • Действие : все намерения Google Maps вызываются как действие просмотра — ACTION_VIEW .
  • URI : намерения Google Maps используют закодированный URL-адрес , указывающий желаемое действие, а также некоторые данные для выполнения действия.
  • Package : вызов setPackage("com.google.android.apps.maps") гарантирует, что приложение Google Maps для Android обрабатывает Intent. Если пакет не установлен, система определит, какие приложения могут обрабатывать Intent . Если доступно несколько приложений, пользователя могут спросить, какое приложение он хотел бы использовать.

После создания Intent вы можете запросить у системы запуск соответствующего приложения несколькими способами. Обычный метод — передать Intent методу startActivity() . Система запустит необходимое приложение — в данном случае Google Maps — и запустит соответствующую Activity .

Джава

// Create a Uri from an intent string. Use the result to create an Intent.
Uri gmmIntentUri = Uri.parse("google.streetview:cbll=46.414382,10.013988");

// Create an Intent from gmmIntentUri. Set the action to ACTION_VIEW
Intent mapIntent = new Intent(Intent.ACTION_VIEW, gmmIntentUri);
// Make the Intent explicit by setting the Google Maps package
mapIntent.setPackage("com.google.android.apps.maps");

// Attempt to start an activity that can handle the Intent
startActivity(mapIntent);

Котлин

// Create a Uri from an intent string. Use the result to create an Intent.
val gmmIntentUri = Uri.parse("google.streetview:cbll=46.414382,10.013988")

// Create an Intent from gmmIntentUri. Set the action to ACTION_VIEW
val mapIntent = Intent(Intent.ACTION_VIEW, gmmIntentUri)
// Make the Intent explicit by setting the Google Maps package
mapIntent.setPackage("com.google.android.apps.maps")

// Attempt to start an activity that can handle the Intent
startActivity(mapIntent)

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

Чтобы убедиться, что приложение доступно для получения намерения, вызовите resolveActivity() в объекте Intent . Если результат не нулевой, существует по крайней мере одно приложение, которое может обработать намерение, и можно безопасно вызывать startActivity() . Если результат равен null , вы не должны использовать намерение и, если возможно, вы должны отключить функцию, которая вызывает намерение.

Джава

if (mapIntent.resolveActivity(getPackageManager()) != null) {
  ...
}

Котлин

mapIntent.resolveActivity(packageManager)?.let {
  ...
}

Например, чтобы отобразить карту Сан-Франциско, вы можете использовать следующий код:

Джава

Uri gmmIntentUri = Uri.parse("geo:37.7749,-122.4194");
Intent mapIntent = new Intent(Intent.ACTION_VIEW, gmmIntentUri);
mapIntent.setPackage("com.google.android.apps.maps");
if (mapIntent.resolveActivity(getPackageManager()) != null) {
  startActivity(mapIntent);
}

Котлин

val gmmIntentUri = Uri.parse("geo:37.7749,-122.4194")
val mapIntent = Intent(Intent.ACTION_VIEW, gmmIntentUri)
mapIntent.setPackage("com.google.android.apps.maps")
mapIntent.resolveActivity(packageManager)?.let {
  startActivity(mapIntent)
}

Строки запроса в кодировке URL

Все строки, передаваемые в Google Maps Intent, должны иметь кодировку URI. Например, строка «1st & Pike, Seattle» должна стать 1st%20%26%20Pike%2C%20Seattle . Пробелы в строке можно закодировать с помощью %20 или заменить знаком плюс (+).

Вы можете использовать метод android.net.Uri parse() для кодирования ваших строк. Например:

Джава

Uri gmmIntentUri =
  Uri.parse("geo:37.7749,-122.4192?q=" + Uri.encode("1st & Pike, Seattle"));

Котлин

val gmmIntentUri =
  Uri.parse("geo:37.7749,-122.4192?q=" + Uri.encode("1st & Pike, Seattle"))

Отображение карты

Используйте geo: намерение для отображения карты в указанном месте и уровне масштабирования.

geo:latitude,longitude?z=zoom

Параметры

  • latitude и longitude задают центральную точку карты.
  • z дополнительно устанавливает начальный уровень масштабирования карты. Допустимые значения варьируются от 0 (весь мир) до 21 (отдельные здания). Верхний предел может варьироваться в зависимости от картографических данных, доступных в выбранном местоположении.

Примеры

Джава

// Creates an Intent that will load a map of San Francisco
Uri gmmIntentUri = Uri.parse("geo:37.7749,-122.4194");
Intent mapIntent = new Intent(Intent.ACTION_VIEW, gmmIntentUri);
mapIntent.setPackage("com.google.android.apps.maps");
startActivity(mapIntent);

Котлин

// Creates an Intent that will load a map of San Francisco
val gmmIntentUri = Uri.parse("geo:37.7749,-122.4194")
val mapIntent = Intent(Intent.ACTION_VIEW, gmmIntentUri)
mapIntent.setPackage("com.google.android.apps.maps")
startActivity(mapIntent)

Поиск местоположения

Используйте это намерение для отображения поисковых запросов в пределах указанного окна просмотра. Когда запрос имеет один результат, вы можете использовать это намерение, чтобы отобразить булавку в определенном месте или адресе, таком как ориентир, предприятие, географический объект или город.

geo:latitude,longitude?q=query
geo:0,0?q=my+street+address
geo:0,0?q=latitude,longitude(label)

Параметры

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

  • q определяет места, которые нужно выделить на карте. Параметр q обязателен для всех поисковых запросов. Он принимает местоположение как название места или адрес. Строка должна быть закодирована в URL , поэтому такой адрес, как "City Hall, New York, NY", должен быть преобразован в City+Hall,New+York,NY.

  • label позволяет установить пользовательскую метку в месте, указанном на карте. label должна быть указана как строка.

Если вы укажете общий поисковый запрос, Google Maps попытается найти место рядом с указанными вами широтой/долготой, которое соответствует вашим критериям. Если местоположение не указано, Google Maps попытается найти близлежащие списки. Например:

Джава

// Search for restaurants nearby
Uri gmmIntentUri = Uri.parse("geo:0,0?q=restaurants");
Intent mapIntent = new Intent(Intent.ACTION_VIEW, gmmIntentUri);
mapIntent.setPackage("com.google.android.apps.maps");
startActivity(mapIntent);

// Search for restaurants in San Francisco
Uri gmmIntentUri = Uri.parse("geo:37.7749,-122.4194?q=restaurants");
Intent mapIntent = new Intent(Intent.ACTION_VIEW, gmmIntentUri);
mapIntent.setPackage("com.google.android.apps.maps");
startActivity(mapIntent);

Котлин

// Search for restaurants nearby
val gmmIntentUri = Uri.parse("geo:0,0?q=restaurants")
val mapIntent = Intent(Intent.ACTION_VIEW, gmmIntentUri)
mapIntent.setPackage("com.google.android.apps.maps")
startActivity(mapIntent)

// Search for restaurants in San Francisco
val gmmIntentUri =
  Uri.parse("geo:37.7749,-122.4194?q=restaurants")
val mapIntent = Intent(Intent.ACTION_VIEW, gmmIntentUri)
mapIntent.setPackage("com.google.android.apps.maps")
startActivity(mapIntent)

Поиск ресторанов в Сан-Франциско

Вы можете дополнительно сместить результаты поиска, указав параметр масштабирования вместе со строкой запроса. В приведенном ниже примере добавление масштаба 10 будет пытаться найти рестораны на уровне города, а не поблизости.

Джава

Uri gmmIntentUri = Uri.parse("geo:37.7749,-122.4194?z=10&q=restaurants");
Intent mapIntent = new Intent(Intent.ACTION_VIEW, gmmIntentUri);
mapIntent.setPackage("com.google.android.apps.maps");
startActivity(mapIntent);

Котлин

val gmmIntentUri =
  Uri.parse("geo:37.7749,-122.4194?z=10&q=restaurants")
val mapIntent = Intent(Intent.ACTION_VIEW, gmmIntentUri)
mapIntent.setPackage("com.google.android.apps.maps")
startActivity(mapIntent)

При поиске определенного адреса будет отображаться булавка в этом месте.

Джава

Uri gmmIntentUri = Uri.parse("geo:0,0?q=1600 Amphitheatre Parkway, Mountain+View, California");
Intent mapIntent = new Intent(Intent.ACTION_VIEW, gmmIntentUri);
mapIntent.setPackage("com.google.android.apps.maps");
startActivity(mapIntent);

Котлин

val gmmIntentUri =
  Uri.parse("geo:0,0?q=1600 Amphitheatre Parkway, Mountain+View, California")
val mapIntent = Intent(Intent.ACTION_VIEW, gmmIntentUri)
mapIntent.setPackage("com.google.android.apps.maps")
startActivity(mapIntent)

В приведенном выше примере широта/долгота задаются равными 0 , 0 , но адрес передается в виде строки запроса. При поиске очень конкретного местоположения широта и долгота не требуются. Однако, если вы не знаете точного адреса, вы можете попытаться исказить результаты поиска, указав координату. Например, поиск по адресу «Главная улица» даст слишком много результатов.

Джава

// Searching for 'Main Street' will return too many results
Uri gmmIntentUri = Uri.parse("geo:0,0?q=101+main+street");

Котлин

// Searching for 'Main Street' will return too many results
val gmmIntentUri = Uri.parse("geo:0,0?q=101+main+street")

Добавление широты/долготы к URI намерения приведет к смещению результатов в сторону определенной области:

Джава

// Searches for 'Main Street' near San Francisco
Uri gmmIntentUri = Uri.parse("geo:37.7749,-122.4194?q=101+main+street");
Intent mapIntent = new Intent(Intent.ACTION_VIEW, gmmIntentUri);
mapIntent.setPackage("com.google.android.apps.maps");
startActivity(mapIntent);

Котлин

// Searches for 'Main Street' near San Francisco
val gmmIntentUri =
  Uri.parse("geo:37.7749,-122.4194?q=101+main+street")
val mapIntent = Intent(Intent.ACTION_VIEW, gmmIntentUri)
mapIntent.setPackage("com.google.android.apps.maps")
startActivity(mapIntent)

Когда вы знаете, что ваш поиск вернет одно значение, вы можете передать необязательную метку. Метки должны быть указаны как строка и будут отображаться под маркером карты. Обратите внимание, что метки доступны только в том случае, если q указано как координата широта/долгота.

Джава

// Display a label at the location of Google's Sydney office
Uri gmmIntentUri = Uri.parse("geo:0,0?q=Google+Sydney@-33.8666,151.1957");
Intent mapIntent = new Intent(Intent.ACTION_VIEW, gmmIntentUri);
mapIntent.setPackage("com.google.android.apps.maps");
startActivity(mapIntent);

Котлин

// Display a label at the location of Google's Sydney office
val gmmIntentUri =
  Uri.parse("geo:0,0?q=-33.8666,151.1957(Google+Sydney)")
val mapIntent = Intent(Intent.ACTION_VIEW, gmmIntentUri)
mapIntent.setPackage("com.google.android.apps.maps")
startActivity(mapIntent)

В качестве альтернативы почтовому адресу или широте/долготе вы можете отобразить булавку в известном месте с помощью кода плюса .

Джава

// Display the location of Google, San Francisco using a global plus code.
Uri gmmIntentUri = Uri.parse("http://plus.codes/849VQJQ5+XX");
// Equivalently, define the same location using a local plus code
gmmIntentUri = Uri.parse("https://plus.codes/QJQ5+XX,San%20Francisco");
// Construct and use the Intent as in the examples above

Котлин

// Display the location of Google, San Francisco using a global plus code.
var gmmIntentUri = Uri.parse("http://plus.codes/849VQJQ5+XX")
// Equivalently, define the same location using a local plus code
gmmIntentUri = Uri.parse("https://plus.codes/QJQ5+XX,San%20Francisco")
// Construct and use the Intent as in the examples above

Запускаем пошаговую навигацию

Используйте это намерение, чтобы запустить навигацию Google Maps с пошаговыми инструкциями по указанному адресу или координате. Направления всегда даются от текущего местоположения пользователя.

google.navigation:q=a+street+address
google.navigation:q=latitude,longitude

Параметры

  • q : устанавливает конечную точку для навигационного поиска. Это значение может быть широтой, координатами долготы или адресом в формате запроса. Если это строка запроса, которая возвращает более одного результата, будет выбран первый результат.

  • mode устанавливает метод транспортировки. Режим является необязательным и может быть установлен на один из:

    • d для вождения (по умолчанию)
    • b для езды на велосипеде
    • l для двухколесного транспорта
    • w для прогулок
  • avoid задает функции, которых маршрут должен стараться избегать. Избегать необязательно и может быть установлено одно или несколько из следующих значений:

    • t для дорожных сборов
    • h для шоссе
    • f для паромов

Примеры

В приведенном ниже Intent будет запрашиваться пошаговая навигация к зоопарку Таронга в Сиднее, Австралия:

Джава

Uri gmmIntentUri = Uri.parse("google.navigation:q=Taronga+Zoo,+Sydney+Australia");
Intent mapIntent = new Intent(Intent.ACTION_VIEW, gmmIntentUri);
mapIntent.setPackage("com.google.android.apps.maps");
startActivity(mapIntent);

Котлин

val gmmIntentUri =
  Uri.parse("google.navigation:q=Taronga+Zoo,+Sydney+Australia")
val mapIntent = Intent(Intent.ACTION_VIEW, gmmIntentUri)
mapIntent.setPackage("com.google.android.apps.maps")
startActivity(mapIntent)

Как добраться до зоопарка Таронга

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

Джава

Uri gmmIntentUri = Uri.parse("google.navigation:q=Taronga+Zoo,+Sydney+Australia&avoid=tf");
Intent mapIntent = new Intent(Intent.ACTION_VIEW, gmmIntentUri);
mapIntent.setPackage("com.google.android.apps.maps");
startActivity(mapIntent);

Котлин

val gmmIntentUri =
  Uri.parse("google.navigation:q=Taronga+Zoo,+Sydney+Australia&avoid=tf")
val mapIntent = Intent(Intent.ACTION_VIEW, gmmIntentUri)
mapIntent.setPackage("com.google.android.apps.maps")
startActivity(mapIntent)

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

Джава

Uri gmmIntentUri = Uri.parse("google.navigation:q=Taronga+Zoo,+Sydney+Australia&mode=b");
Intent mapIntent = new Intent(Intent.ACTION_VIEW, gmmIntentUri);
mapIntent.setPackage("com.google.android.apps.maps");
startActivity(mapIntent);

Котлин

val gmmIntentUri =
  Uri.parse("google.navigation:q=Taronga+Zoo,+Sydney+Australia&mode=b")
val mapIntent = Intent(Intent.ACTION_VIEW, gmmIntentUri)
mapIntent.setPackage("com.google.android.apps.maps")
startActivity(mapIntent)

Если вы предпочитаете моторизованный двухколесный транспорт, вы можете запросить, чтобы в маршруте были указаны узкие дороги и тропы, недоступные для автомобилей. Приведенное ниже intent возвращает маршрут в Индии.

Джава

Uri gmmIntentUri = Uri.parse("google.navigation:q=Connaught+Place,+New+Delhi,Delhi&mode=l");
Intent mapIntent = new Intent(Intent.ACTION_VIEW, gmmIntentUri);
mapIntent.setPackage("com.google.android.apps.maps");
startActivity(mapIntent);

Котлин

val gmmIntentUri =
  Uri.parse("google.navigation:q=Connaught+Place,+New+Delhi,Delhi&mode=l")
val mapIntent = Intent(Intent.ACTION_VIEW, gmmIntentUri)
mapIntent.setPackage("com.google.android.apps.maps")
startActivity(mapIntent)

Отображение панорамы просмотра улиц

Используйте намерение google.streetview для запуска Google Street View. Google Street View обеспечивает панорамный вид из определенных мест по всей зоне покрытия . Пользовательские фотосферы и специальные коллекции Просмотра улиц также доступны.

google.streetview:cbll=latitude,longitude&cbp=0,bearing,0,zoom,tilt
google.streetview:panoid=id&cbp=0,bearing,0,zoom,tilt

Параметры

Все URI google.streetview должны включать параметр cbll или panoid .

  • cbll принимает широту и долготу как значения, разделенные запятыми ( 46.414382,10.013988 ). Приложение отобразит панораму, сфотографированную ближе всего к этому месту. Поскольку изображения в Просмотре улиц периодически обновляются, а фотографии могут каждый раз делаться с немного разных позиций, возможно, что ваше местоположение может быть привязано к другой панораме при обновлении изображений.

  • panoid — это идентификатор конкретной панорамы. Карты Google будут использовать идентификатор панорамы, если указаны и panoid , и cbll . Идентификаторы панорамы доступны приложению Android из объекта StreetViewPanoramaLocation .

  • cbp — необязательный параметр, который регулирует начальную ориентацию камеры. Параметр cbp принимает 5 значений, разделенных запятыми, и все они являются необязательными. Наиболее важными значениями являются второе, четвертое и пятое, которые задают азимут, масштабирование и наклон соответственно. Первое и третье значения не поддерживаются и должны быть установлены на 0 .

    • bearing : указывает направление камеры по компасу в градусах по часовой стрелке от севера. Истинный север равен 0, восток равен 90, юг равен 180, запад равен 270. Значения, переданные в пеленг, будут перенесены; то есть 0°, 360° и 720° указывают в одном направлении. Подшипник определяется как второе из пяти значений, разделенных запятыми.
    • zoom : Устанавливает уровень масштабирования камеры. Уровень масштабирования по умолчанию установлен на 0. Масштаб, равный 1, удваивает увеличение. Масштаб фиксируется между 0 и максимальным уровнем масштабирования для текущей панорамы. Это означает, что любое значение, выходящее за пределы этого диапазона, будет установлено на ближайшее предельное значение, попадающее в этот диапазон. Например, значение -1 будет равно 0. Масштаб — это четвертое из пяти значений, разделенных запятыми.
    • tilt : указывает угол, вверх или вниз, камеры. Диапазон составляет от -90 до 0 и 90, где 90 смотрит прямо вниз, 0 по центру горизонта и -90 смотрит прямо вверх.

Примеры

Ниже приведены несколько примеров использования намерения Просмотра улиц.

Джава

// Displays an image of the Swiss Alps
Uri gmmIntentUri = Uri.parse("google.streetview:cbll=46.414382,10.013988");
Intent mapIntent = new Intent(Intent.ACTION_VIEW, gmmIntentUri);
mapIntent.setPackage("com.google.android.apps.maps");
startActivity(mapIntent);

// Uses a PanoID to show an image from Maroubra beach in Sydney, Australia
Uri gmmIntentUri = Uri.parse("google.streetview:panoid=Iaa2JyfIggYAAAQfCZU9KQ");
Intent mapIntent = new Intent(Intent.ACTION_VIEW, gmmIntentUri);
mapIntent.setPackage("com.google.android.apps.maps");
startActivity(mapIntent);

// Opens Street View between two Pyramids in Giza. The values passed to the
// cbp parameter will angle the camera slightly up, and towards the east.
Uri gmmIntentUri = Uri.parse("google.streetview:cbll=29.9774614,31.1329645&cbp=0,30,0,0,-15");
Intent mapIntent = new Intent(Intent.ACTION_VIEW, gmmIntentUri);
mapIntent.setPackage("com.google.android.apps.maps");
startActivity(mapIntent);

Котлин

// Displays an image of the Swiss Alps
val gmmIntentUri =
  Uri.parse("google.streetview:cbll=46.414382,10.013988")
val mapIntent = Intent(Intent.ACTION_VIEW, gmmIntentUri)
mapIntent.setPackage("com.google.android.apps.maps")
startActivity(mapIntent)

// Uses a PanoID to show an image from Maroubra beach in Sydney, Australia
val gmmIntentUri =
  Uri.parse("google.streetview:panoid=Iaa2JyfIggYAAAQfCZU9KQ")
val mapIntent = Intent(Intent.ACTION_VIEW, gmmIntentUri)
mapIntent.setPackage("com.google.android.apps.maps")
startActivity(mapIntent)

// Opens Street View between two Pyramids in Giza. The values passed to the
// cbp parameter will angle the camera slightly up, and towards the east.
val gmmIntentUri =
  Uri.parse("google.streetview:cbll=29.9774614,31.1329645&cbp=0,30,0,0,-15")
val mapIntent = Intent(Intent.ACTION_VIEW, gmmIntentUri)
mapIntent.setPackage("com.google.android.apps.maps")
startActivity(mapIntent)

Пирамиды в Просмотре улиц