Функция автозаполнения (новая) возвращает прогнозы местоположений в ответ на запрос, включающий строку поиска и географические границы, определяющие область поиска. Функция автозаполнения может выполнять поиск по полным словам и подстрокам входных данных, определяя названия мест, адреса и плюс-коды . Ваше приложение может отправлять запросы по мере ввода текста пользователем, чтобы оперативно предоставлять прогнозы местоположений и запросов.
Например, вы вызываете функцию автозаполнения, используя в качестве входных данных строку, содержащую частично введенный пользователем запрос «Sicilian piz», при этом область поиска ограничена Сан-Франциско, штат Калифорния. Ответ содержит список подсказок мест, соответствующих строке поиска и области поиска, например, ресторан «Sicilian Pizza Kitchen». Возвращаемые подсказки мест предназначены для того, чтобы предоставить пользователю возможность выбора нужного места. Вы можете выполнить запрос « Сведения о месте (новое)» , чтобы получить дополнительную информацию о любом из подсказок мест.
Интегрировать функцию автозаполнения (новая) в свое приложение можно двумя основными способами:
- Добавьте виджет автозаполнения Place : предоставляет готовый к использованию интерфейс автозаполнения поиска с помощью класса
PlaceAutocomplete, который отображает подсказки по мере ввода текста пользователем. - Получайте прогнозы мест программным способом : вызывайте API напрямую, чтобы получить прогнозы и отобразить их в пользовательском интерфейсе.
Добавьте виджет автозаполнения мест
Чтобы упростить обеспечение единообразного автодополнения мест, вы можете добавить в приложение виджет «Автодополнение мест». Виджет предоставляет специальный полноэкранный интерфейс, который обрабатывает пользовательский ввод и отображает подсказки мест, одновременно возвращая приложению объекты AutocompletePrediction . Затем вы можете выполнить запрос « Сведения о месте (новый)» , чтобы получить дополнительную информацию о любом из подсказок.

Как и при программном получении прогнозов мест , виджет автозаполнения мест позволяет использовать токены сеанса для группировки запросов автозаполнения в сеанс для выставления счетов. Вы можете передать токен сеанса при создании намерения для виджета, вызвав setAutocompleteSessionToken() . Если вы не предоставите токен сеанса, виджет создаст его автоматически, и вы сможете получить к нему доступ, вызвав getSessionTokenFromIntent() . Подробнее об использовании токенов сеанса см. в разделе «О токенах сеанса» .
Чтобы добавить виджет Place Autocomplete в свое приложение:
(Необязательно) Задайте токен сеанса. Если вы не укажете токен сеанса, виджет создаст его автоматически.
Определите
autocompleteIntentс желаемыми параметрами и токеном сеанса.Определите
ActivityResultLauncherдляStartActivityForResult. Этот лаунчер будет обрабатывать результат, возвращаемый действием автозаполнения.Обработайте результат в обратном вызове
ActivityResultLauncher. Это включает в себя извлечениеAutocompletePredictionиAutocompleteSessionToken(если вы не указали свои), обработку ошибок и, при необходимости, выполнение запросаfetchPlace()для получения дополнительных сведений о месте.Запустите намерение с помощью
placeAutocompleteActivityResultLauncher
В следующих примерах показано, как добавить виджет Place Autocomplete с использованием Kotlin и Java:
Котлин
// Provide the API key that has enabled "Places API (New)" in the Google Cloud Console. Places.initializeWithNewPlacesApiEnabled(/* Context= */ context, /* API Key= */ key) // Optional, create a session token for Autocomplete request and the followup FetchPlace request. val sessionToken: AutocompleteSessionToken = AutocompleteSessionToken.newInstance() val autocompleteIntent: Intent = PlaceAutocomplete.createIntent(this) { // ... provide input params for origin, countries, types filter ... setAutocompleteSessionToken(sessionToken) } val placeAutocompleteActivityResultLauncher: ActivityResultLauncher<Intent> = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result: ActivityResult -> val intent = result.data if (intent != null && result.resultCode == PlaceAutocompleteActivity.RESULT_OK) { // get prediction object val prediction: AutocompletePrediction? = PlaceAutocomplete.getPredictionFromIntent(intent!!) // get session token val sessionToken: AutocompleteSessionToken? = PlaceAutocomplete.getSessionTokenFromIntent(intent!!) // create PlacesClient to make FetchPlace request (optional) val placesClient: PlacesClient = Places.createClient(this) val response = placesClient.awaitFetchPlace(prediction.placeId, Field.DISPLAY_NAME) { sessionToken = sessionToken // optional } } } // Launch Activity placeAutocompleteActivityResultLauncher.launch(autocompleteIntent)
Ява
// Provide the API key that has enabled "Places API (New)" in the Google Cloud Console. Places.initializeWithNewPlacesApiEnabled(/* Context= */ context, /* API Key= */ key); // Optional, create a session token for Autocomplete request and the followup FetchPlace request AutocompleteSessionToken sessionToken = AutocompleteSessionToken.newInstance(); Intent autocompleteIntent = new PlaceAutocomplete.IntentBuilder() // ... set input params for origin, countries, types filter ... .setSessionToken(sessionToken) // optional .build(this); ActivityResultLauncher<Intent> placeAutocompleteActivityResultLauncher = registerForActivityResult( new ActivityResultContracts.StartActivityForResult(), new ActivityResultCallback<ActivityResult>() { @Override public void onActivityResult(ActivityResult result) { Intent intent = result.getData(); if (result.getResultCode() == PlaceAutocompleteActivity.RESULT_OK) { // get prediction object AutocompletePrediction prediction = PlaceAutocomplete.getPredictionFromIntent( Preconditions.checkNotNull(intent)); // get session token AutocompleteSessionToken sessionToken = PlaceAutocomplete.getSessionTokenFromIntent( Preconditions.checkNotNull(intent)); // create PlacesClient to make FetchPlace request (optional) PlacesClient placesClient = Places.createClient(this); FetchPlaceRequest request = FetchPlaceRequest.builder(prediction.getPlaceId(), Arrays.asList(Field.DISPLAY_NAME)) .setSessionToken(sessionToken).build(); Task<FetchPlaceResponse> task = placesClient.fetchPlace(request); } } } ); // Launch Activity placeAutocompleteActivityResultLauncher.launch(autocompleteIntent);
Настройте тему
При создании экземпляра автозаполнения вы можете указать тему, которая переопределит любые атрибуты стиля по умолчанию. Вы можете настроить цвета, типографику, интервалы, границы и углы компонента автозаполнения Place. Значение по умолчанию — PlacesMaterialTheme . Все атрибуты темы, которые не переопределяются, используют стили по умолчанию.
Вы можете определить переопределения темы в …/res/values/themes.xml . Например:
<?xml version="1.0" encoding="utf-8"?> <resources> <style name="BrandedTheme" parent="PlacesMaterialTheme"> <!-- Color tokens. --> <item name="placesColorOnNeutralContainer">#5300e8</item> <item name="placesColorOnNeutralContainerVariant">#ee6002</item> ... <!-- Typography tokens. --> <item name="placesTextAppearanceTitleLarge">@style/PlacesTextAppearance</item> <item name="placesTextAppearanceBodyMedium">@style/PlacesTextAppearance</item> ... <!-- Spacing tokens. --> <item name="placesSpacingSmall">6dp</item> <item name="placesSpacingMedium">12dp</item> ... <!-- Attribution tokens. --> <item name="placesColorAttributionLightTheme">white</item> <item name="placesColorAttributionDarkTheme">black</item> </style> </resources>
Затем вы можете ссылаться на переопределенные стили, вызвав setAutocompleteUiCustomization :
ActivityResultLauncher<Intent> placeAutocompleteActivityResultLauncher = registerForActivityResult( new ActivityResultContracts.StartActivityForResult(), new ActivityResultCallback<ActivityResult>() { @Override public void onActivityResult(ActivityResult result) { Intent intent = result.getData(); if (intent != null) { AutocompletePrediction prediction = PlaceAutocomplete.getPredictionFromIntent(intent); AutocompleteSessionToken sessionToken = PlaceAutocomplete.getSessionTokenFromIntent(intent); Status status = PlaceAutocomplete.getResultStatusFromIntent(intent); ... } } } ); Intent placeAutocompleteIntent = new PlaceAutocomplete.IntentBuilder() .setInitialQuery("INSERT_QUERY_TEXT") .setOrigin(new LatLng(10.0, 10.0)) ... .setAutocompleteUiCustomization( AutocompleteUiCustomization.builder() .listItemIcon(AutocompleteUiIcon.noIcon()) .listDensity(AutocompleteListDensity.MULTI_LINE) .theme(R.style.BrandedTheme) .build()) .build(this); placeAutocompleteActivityResultLauncher.launch(placeAutocompleteIntent);
Получайте прогнозы мест программно
Ваше приложение может получить список предполагаемых названий мест и/или адресов из API автодополнения, вызвав метод PlacesClient.findAutocompletePredictions() и передав объект FindAutocompletePredictionsRequest . В примере ниже показан полный вызов PlacesClient.findAutocompletePredictions() .
Places.initializeWithNewPlacesApiEnabled(context, apiKey);
final List<Field> placeFields = getPlaceFields();
LatLng center = new LatLng(37.7749, -122.4194);
CircularBounds circle = CircularBounds.newInstance(center, /* radius = */ 5000);
final FindAutocompletePredictionsRequest autocompletePlacesRequest =
FindAutocompletePredictionsRequest.builder()
.setQuery("Sicilian piz")
.setRegionCode("ES")
.setLocationRestriction(circle)
.build());
placesClient.findAutocompletePredictions(autoCompletePlacesRequest)
.addOnSuccessListener(
(response) -> {
List<AutocompletePrediction> predictions = response.getResult().getAutocompletePredictions();
}
).addOnFailureListener(
exception -> {
Log.e(TAG, "some exception happened" + exception.getMessage());
})
);Автозаполнение (новых) ответов
API возвращает FindAutocompletePredictionsResponse в Task . FindAutocompletePredictionsResponse содержит список из пяти объектов AutocompletePrediction , представляющих предсказанные места. Список может быть пустым, если нет известного места, соответствующего запросу и критериям фильтра.
Для каждого предсказанного места вы можете вызвать следующие методы для получения сведений о месте:
-
getFullText(CharacterStyle)возвращает полный текст описания места. Это комбинация основного и дополнительного текста. Пример: « Эйфелева башня, авеню Анатоля Франса, Париж, Франция ». Кроме того, этот метод позволяет выделить разделы описания, соответствующие поисковому запросу, с помощью стиля по вашему выбору с помощьюCharacterStyle. ПараметрCharacterStyleнеобязателен. Установите его в null, если выделение не требуется. -
getPrimaryText(CharacterStyle)возвращает основной текст, описывающий место. Обычно это название места. Примеры: « Эйфелева башня » и « Питт-стрит, 123 ». -
getSecondaryText(CharacterStyle)возвращает дополнительный текст описания места. Это полезно, например, в качестве второй строки при показе подсказок автодополнения. Примеры: « Авеню Анатоля Франса, Париж, Франция » и « Сидней, Новый Южный Уэльс ». -
getPlaceId()возвращает идентификатор предсказанного места. Идентификатор места — это текстовый идентификатор, который уникально идентифицирует место и может быть использован для последующего получения объектаPlace. Подробнее об идентификаторах мест в автозаполнении см. в разделе «Сведения о месте (новое)» . Общую информацию об идентификаторах мест см. в разделе «Обзор идентификаторов мест» . -
getTypes()возвращает список типов мест, связанных с этим местом. -
getDistanceMeters()возвращает расстояние по прямой в метрах между данным местом и точкой начала координат, указанной в запросе.
Обязательные параметры
Запрос
Текстовая строка для поиска. Укажите полные слова и подстроки, названия мест, адреса и плюс-коды . Служба автозаполнения (новая) возвращает возможные совпадения на основе этой строки и упорядочивает результаты по степени их релевантности.
Чтобы задать параметр запроса, вызовите метод
setQuery()при построении объектаFindAutocompletePredictionsRequest.
Необязательные параметры
Основные типы
Список, содержащий до пяти значений типа из таблицы A или таблицы B , используемых для фильтрации мест, возвращаемых в ответе. Для включения места в ответ оно должно соответствовать одному из указанных значений основного типа.
Место может иметь только один основной тип из числа связанных с ним типов Table A или Table B. Например, основным типом может быть
"mexican_restaurant"или"steak_house".Запрос отклоняется с ошибкой
INVALID_REQUEST, если:- Указано более пяти типов.
- Указаны все нераспознанные типы.
Чтобы задать параметр основных типов, вызовите метод
setTypesFilter()при построении объектаFindAutocompletePredictionsRequest.Страны
Включать результаты только из списка указанных стран, представленного в виде списка, содержащего до 15 двухсимвольных значений ccTLD («доменов верхнего уровня») . Если этот параметр пропущен, к ответу не применяются никакие ограничения. Например, чтобы ограничить регионы Германией и Францией:
Если указать и
locationRestriction, иincludedRegionCodes, результаты будут расположены в области пересечения двух настроек.Чтобы задать параметр стран, вызовите метод
setCountries()при построении объектаFindAutocompletePredictionsRequest.Смещение ввода
Смещение символа Unicode (отсчитывается от нуля), указывающее позицию курсора в запросе. Положение курсора может влиять на возвращаемые прогнозы. Если значение пустое, по умолчанию используется длина запроса.
Чтобы задать параметр смещения ввода, вызовите метод
setInputOffset()при построении объектаFindAutocompletePredictionsRequest.Предвзятость местоположения или ограничение местоположения
Вы можете указать смещение по местоположению или ограничение по местоположению, но не оба варианта одновременно, чтобы определить область поиска. Ограничение по местоположению подразумевает указание региона, в пределах которого должны быть результаты, а смещение по местоположению — региона, вблизи которого должны быть результаты. Ключевое отличие заключается в том, что при смещении по местоположению результаты за пределами указанного региона всё равно могут быть возвращены.
Смещение местоположения
Указывает область поиска. Это местоположение служит ориентиром, а не ограничением, поэтому результаты за пределами указанной области могут быть возвращены.
Чтобы задать параметр смещения местоположения, вызовите метод
setLocationBias()при построении объектаFindAutocompletePredictionsRequest.Ограничение местоположения
Указывает область поиска. Результаты за пределами указанной области не возвращаются.
Чтобы задать параметр ограничения местоположения, вызовите метод
setLocationRestriction()при построении объектаFindAutocompletePredictionsRequest.
Укажите область смещения местоположения или ограничения местоположения в виде прямоугольной области просмотра или в виде круга.
Окружность определяется точкой центра и радиусом в метрах. Радиус должен находиться в диапазоне от 0,0 до 50000,0 включительно. Значение по умолчанию — 0,0. Для ограничения местоположения необходимо установить радиус больше 0,0. В противном случае запрос не вернёт результатов.
Прямоугольник — это область просмотра, представленная в виде двух диагонально противоположных точек:
lowиhigh. Область просмотра считается замкнутой областью, то есть включает её границу. Границы широты должны находиться в диапазоне от -90 до 90 градусов включительно, а границы долготы — в диапазоне от -180 до 180 градусов включительно.- Если
low=high, то область просмотра состоит из этой единственной точки. - Если
low.longitude>high.longitude, диапазон долготы инвертируется (область просмотра пересекает линию долготы 180 градусов). - Если
low.longitude= -180 градусов иhigh.longitude= 180 градусов, область просмотра включает все долготы. - Если
low.longitude= 180 градусов, аhigh.longitude= -180 градусов, диапазон долготы пуст.
Оба
lowиhighдолжны быть заполнены, и отображаемое поле не может быть пустым. Пустая область просмотра приводит к ошибке.- Если
Источник
Начальная точка, от которой рассчитывается расстояние по прямой до пункта назначения (доступ к ней осуществляется с помощью
getDistanceMeters()). Если это значение пропущено, расстояние по прямой не будет возвращено. Необходимо указать координаты широты и долготы:Чтобы задать параметр источника, вызовите метод
setOrigin()при построении объектаFindAutocompletePredictionsRequest.Код региона
Код региона, используемый для форматирования ответа, включая форматирование адреса, указан в виде двухсимвольного значения ccTLD («домен верхнего уровня») . Большинство кодов ccTLD идентичны кодам ISO 3166-1, за некоторыми заметными исключениями. Например, ccTLD Великобритании — «uk» (.co.uk), а код ISO 3166-1 — «gb» (технически обозначает «Соединённое Королевство Великобритании и Северной Ирландии»).
Если указан недопустимый код региона, API возвращает ошибку
INVALID_ARGUMENT. Этот параметр может повлиять на результаты в соответствии с действующим законодательством.Чтобы задать параметр кода региона, вызовите метод
setRegionCode()при построении объектаFindAutocompletePredictionsRequest.Токен сеанса
Токены сеансов — это генерируемые пользователем строки, которые отслеживают вызовы автозаполнения (New) — как вызовы, выполненные через виджет, так и программные вызовы — как «сеансы». Автозаполнение использует токены сеансов для группировки этапов запроса и выбора в рамках поиска с автозаполнением в отдельный сеанс для выставления счетов. Сеанс начинается, когда пользователь начинает вводить запрос, и заканчивается, когда он выбирает место. В каждом сеансе может быть несколько запросов, за которыми следует выбор одного места. После завершения сеанса токен становится недействительным; ваше приложение должно генерировать новый токен для каждого сеанса. Мы рекомендуем использовать токены сеансов для всех сеансов программного автозаполнения (при встраивании фрагмента или запуске автозаполнения с помощью намерения API делает это автоматически).
Функция автозаполнения использует
AutocompleteSessionTokenдля идентификации каждого сеанса. Ваше приложение должно передавать новый токен сеанса при начале каждого нового сеанса, а затем передавать этот же токен вместе с идентификатором места в последующем вызовеfetchPlace()для получения сведений о месте, выбранном пользователем.Чтобы задать параметр токена сеанса, вызовите метод
setSessionToken()при построении объектаFindAutocompletePredictionsRequest.Более подробную информацию см. в разделе Токены сеанса .
Примеры автозаполнения (новые)
Использовать ограничение местоположения и смещение местоположения
Функция автозаполнения (новая) по умолчанию использует смещение по IP для управления областью поиска. При смещении по IP API использует IP-адрес устройства для смещения результатов. Для указания области поиска можно использовать ограничение местоположения или смещение местоположения , но не оба одновременно.
Ограничение местоположения определяет область поиска. Результаты за пределами указанной области не возвращаются. В следующем примере ограничение местоположения используется для ограничения запроса круговым ограничением местоположения с радиусом 5000 метров с центром в Сан-Франциско:
Places.initializeWithNewPlacesApiEnabled(context, apiKey);
final List<Field> placeFields = getPlaceFields();
LatLng center = new LatLng(37.7749, -122.4194);
CircularBounds circle = CircularBounds.newInstance(center, /* radius = */ 5000);
final FindAutocompletePredictionsRequest autocompletePlacesRequest =
FindAutocompletePredictionsRequest.builder()
.setQuery("Amoeba")
.setLocationRestriction(circle)
.build());
placesClient.findAutocompletePredictions(autoCompletePlacesRequest)
.addOnSuccessListener(
(response) -> {
List<AutocompletePrediction> predictions = response.getResult().getAutocompletePredictions();
}
).addOnFailureListener(
exception -> {
Log.e(TAG, "some exception happened" + exception.getMessage());
})
);При использовании смещения местоположения само местоположение служит фактором смещения, что означает, что могут быть возвращены результаты, близкие к указанному местоположению, включая результаты за пределами указанной области. В следующем примере предыдущий запрос изменяется с учетом смещения местоположения:
Places.initializeWithNewPlacesApiEnabled(context, apiKey);
final List<Field> placeFields = getPlaceFields();
LatLng center = new LatLng(37.7749, -122.4194);
CircularBounds circle = CircularBounds.newInstance(center, /* radius = */ 5000);
final FindAutocompletePredictionsRequest autocompletePlacesRequest =
FindAutocompletePredictionsRequest.builder()
.setQuery("Amoeba")
.setLocationBias(circle)
.build());
placesClient.findAutocompletePredictions(autoCompletePlacesRequest)
.addOnSuccessListener(
(response) -> {
List<AutocompletePrediction> predictions = response.getResult().getAutocompletePredictions();
}
).addOnFailureListener(
exception -> {
Log.e(TAG, "some exception happened" + exception.getMessage());
})
);Используйте основные типы
Используйте параметр «Основные типы» , чтобы ограничить результаты запроса определённым типом, как указано в таблицах A и B. Вы можете указать массив, содержащий до пяти значений. Если этот параметр не указан, возвращаются все типы.
В следующем примере указывается строка запроса «Футбол» и используется параметр основного типа для ограничения результатов заведениями типа "sporting_goods_store" :
Places.initializeWithNewPlacesApiEnabled(context, apiKey);
final List<Field> placeFields = getPlaceFields();
final List<Place.Field> primaryTypes = Arrays.asList("sporting_goods_store");
LatLng center = new LatLng(37.7749, -122.4194);
CircularBounds circle = CircularBounds.newInstance(center, /* radius = */ 5000);
final FindAutocompletePredictionsRequest autocompletePlacesRequest =
FindAutocompletePredictionsRequest.builder()
.setQuery("Soccer")
.setIncludedPrimaryTypes(primaryTypes)
.setLocationBias(circle)
.build());
placesClient.findAutocompletePredictions(autoCompletePlacesRequest)
.addOnSuccessListener(
(response) -> {
List<AutocompletePrediction> predictions = response.getResult().getAutocompletePredictions();
}
).addOnFailureListener(
exception -> {
Log.e(TAG, "some exception happened" + exception.getMessage());
})
); Если вы опустите параметр основных типов, результаты могут включать заведения типа, который вам не нужен, например "athletic_field" .
Использовать источник
При включении параметра исходной точки в запрос, заданного в виде координат широты и долготы, API включает в ответ расстояние по прямой от исходной точки до пункта назначения (доступ к которому осуществляется с помощью getDistanceMeters() ). В этом примере исходная точка устанавливается в центре Сан-Франциско:
Places.initializeWithNewPlacesApiEnabled(context, apiKey);
final List<Field> placeFields = getPlaceFields();
LatLng center = new LatLng(37.7749, -122.4194);
CircularBounds circle = CircularBounds.newInstance(center, /* radius = */ 5000);
final FindAutocompletePredictionsRequest autocompletePlacesRequest =
FindAutocompletePredictionsRequest.builder()
.setQuery("Amoeba")
.setOrigin(center)
.setLocationRestriction(circle)
.build());
placesClient.findAutocompletePredictions(autoCompletePlacesRequest)
.addOnSuccessListener(
(response) -> {
List<AutocompletePrediction> predictions = response.getResult().getAutocompletePredictions();
}
).addOnFailureListener(
exception -> {
Log.e(TAG, "some exception happened" + exception.getMessage());
})
);