Служба автодополнения в Places SDK для Android возвращает прогнозы мест в ответ на поисковые запросы пользователя. По мере ввода текста служба автодополнения предлагает варианты мест, такие как названия компаний, адреса, коды плюсов и достопримечательности.
Добавить автозаполнение в приложение можно следующими способами:
- Добавьте виджет автозаполнения , чтобы сэкономить время разработки и обеспечить единообразный пользовательский интерфейс.
- Получайте прогнозы мест программным способом, чтобы создать персонализированный пользовательский интерфейс.
Добавить виджет автозаполнения
Виджет автодополнения — это диалоговое окно поиска со встроенной функцией автодополнения. При вводе пользователем поискового запроса виджет отображает список предполагаемых мест для выбора. Когда пользователь делает выбор, возвращается экземпляр Place
, который ваше приложение может использовать для получения информации о выбранном месте.
Есть два варианта добавления виджета автозаполнения в ваше приложение:
- Вариант 1: Встроить
AutocompleteSupportFragment
. - Вариант 2: использование намерения для запуска действия автозаполнения .
Вариант 1: Встроить AutocompleteSupportFragment
Чтобы добавить AutocompleteSupportFragment
в ваше приложение, выполните следующие действия:
- Добавьте фрагмент в XML-макет вашей активности.
- Добавьте прослушиватель к вашей активности или фрагменту.
Добавить AutocompleteSupportFragment в действие
Чтобы добавить AutocompleteSupportFragment
в действие, добавьте новый фрагмент в XML-макет. Например:
<fragment android:id="@+id/autocomplete_fragment"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:name="com.google.android.libraries.places.widget.AutocompleteSupportFragment"
/>
- По умолчанию фрагмент не имеет рамки и фона. Для обеспечения единообразного внешнего вида фрагмент следует вложить в другой элемент макета, например, CardView .
- Если вы используете фрагмент Autocomplete и вам необходимо переопределить
onActivityResult
, необходимо вызватьsuper.onActivityResult
, иначе фрагмент не будет работать правильно.
Добавьте PlaceSelectionListener к действию
Слушатель PlaceSelectionListener
отвечает за возврат места в ответ на выбор пользователя. Следующий код демонстрирует создание ссылки на фрагмент и добавление прослушивателя к AutocompleteSupportFragment
:
Котлин
// Initialize the AutocompleteSupportFragment. val autocompleteFragment = supportFragmentManager.findFragmentById(R.id.autocomplete_fragment) as AutocompleteSupportFragment // Specify the types of place data to return. autocompleteFragment.setPlaceFields(listOf(Place.Field.ID, Place.Field.NAME)) // Set up a PlaceSelectionListener to handle the response. autocompleteFragment.setOnPlaceSelectedListener(object : PlaceSelectionListener { override fun onPlaceSelected(place: Place) { // TODO: Get info about the selected place. Log.i(TAG, "Place: ${place.name}, ${place.id}") } override fun onError(status: Status) { // TODO: Handle the error. Log.i(TAG, "An error occurred: $status") } })
Ява
// Initialize the AutocompleteSupportFragment. AutocompleteSupportFragment autocompleteFragment = (AutocompleteSupportFragment) getSupportFragmentManager().findFragmentById(R.id.autocomplete_fragment); // Specify the types of place data to return. autocompleteFragment.setPlaceFields(Arrays.asList(Place.Field.ID, Place.Field.NAME)); // Set up a PlaceSelectionListener to handle the response. autocompleteFragment.setOnPlaceSelectedListener(new PlaceSelectionListener() { @Override public void onPlaceSelected(@NonNull Place place) { // TODO: Get info about the selected place. Log.i(TAG, "Place: " + place.getName() + ", " + place.getId()); } @Override public void onError(@NonNull Status status) { // TODO: Handle the error. Log.i(TAG, "An error occurred: " + status); } });
Вариант 2: использование намерения для запуска действия автозаполнения
Если вы хотите, чтобы ваше приложение использовало другой навигационный поток (например, чтобы автозаполнение запускалось с помощью значка, а не поля поиска), ваше приложение может запустить автозаполнение с помощью намерения.
Чтобы запустить виджет автозаполнения с помощью намерения, выполните следующие действия:
- Используйте
Autocomplete.IntentBuilder
для создания намерения, передавая желаемый режимAutocomplete
. - Определите средство запуска результата действия
registerForActivityResult
, которое можно использовать для запуска намерения и обработки выбранного пользователем прогноза места в результате.
Создайте намерение автозаполнения
В примере ниже Autocomplete.IntentBuilder
используется для создания намерения запустить виджет автозаполнения в качестве намерения:
Котлин
// Set the fields to specify which types of place data to // return after the user has made a selection. val fields = listOf(Place.Field.ID, Place.Field.NAME) // Start the autocomplete intent. val intent = Autocomplete.IntentBuilder(AutocompleteActivityMode.FULLSCREEN, fields) .build(this) startAutocomplete.launch(intent)
Ява
// Set the fields to specify which types of place data to // return after the user has made a selection. List<Place.Field> fields = Arrays.asList(Place.Field.ID, Place.Field.NAME); // Start the autocomplete intent. Intent intent = new Autocomplete.IntentBuilder(AutocompleteActivityMode.FULLSCREEN, fields) .build(this); startAutocomplete.launch(intent);
При использовании намерения для запуска виджета автозаполнения вы можете выбрать режим отображения: наложение или полноэкранный режим. На следующих снимках экрана показаны каждый из режимов отображения:


Зарегистрируйте обратный вызов для результата намерения
Чтобы получать уведомление о выборе пользователем места, определите метод registerForActivityResult()
, который запускает активность и обрабатывает результат, как показано в следующем примере. Если пользователь выбрал прогноз, он будет отправлен в намерение, содержащееся в объекте результата. Поскольку намерение было создано с помощью Autocomplete.IntentBuilder
, метод Autocomplete.getPlaceFromIntent()
может извлечь из него объект Place.
Котлин
private val startAutocomplete = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result: ActivityResult -> if (result.resultCode == Activity.RESULT_OK) { val intent = result.data if (intent != null) { val place = Autocomplete.getPlaceFromIntent(intent) Log.i( TAG, "Place: ${place.name}, ${place.id}" ) } } else if (result.resultCode == Activity.RESULT_CANCELED) { // The user canceled the operation. Log.i(TAG, "User canceled autocomplete") } }
Ява
private final ActivityResultLauncher<Intent> startAutocomplete = registerForActivityResult( new ActivityResultContracts.StartActivityForResult(), result -> { if (result.getResultCode() == Activity.RESULT_OK) { Intent intent = result.getData(); if (intent != null) { Place place = Autocomplete.getPlaceFromIntent(intent); Log.i(TAG, "Place: ${place.getName()}, ${place.getId()}"); } } else if (result.getResultCode() == Activity.RESULT_CANCELED) { // The user canceled the operation. Log.i(TAG, "User canceled autocomplete"); } });
Получение прогнозов мест программным способом
Вы можете создать собственный интерфейс поиска в качестве альтернативы интерфейсу виджета автодополнения. Для этого ваше приложение должно программно получать подсказки мест. Вы можете получить список подсказок названий мест и/или адресов из API автодополнения, вызвав метод PlacesClient.findAutocompletePredictions()
и передав объект FindAutocompletePredictionsRequest
со следующими параметрами:
- Обязательно: строка
query
, содержащая текст, введенный пользователем. - Рекомендуется:
AutocompleteSessionToken
, который группирует этапы запроса и выбора в рамках пользовательского поиска в отдельный сеанс для выставления счетов. Сеанс начинается с момента ввода запроса пользователем и заканчивается выбором места. - Рекомендуется: объект
RectangularBounds
, который задает границы широты и долготы для ограничения результатов указанным регионом . - Необязательно: один или несколько двухбуквенных кодов страны (ISO 3166-1 Alpha-2), указывающих страну или страны, которыми следует ограничить результаты.
Необязательно:
TypeFilter
, который можно использовать для ограничения результатов указанным типом места. Поддерживаются следующие типы мест:-
TypeFilter.GEOCODE
– Возвращает только результаты геокодирования, а не предприятия. Используйте этот запрос для устранения неоднозначности результатов, где указанное местоположение может быть неопределенным. -
TypeFilter.ADDRESS
– Возвращает только результаты автодополнения с точным адресом. Используйте этот тип, когда знаете, что пользователь ищет полностью указанный адрес. -
TypeFilter.ESTABLISHMENT
– Возвращает только места, являющиеся предприятиями. TypeFilter.REGIONS
– Возвращает только места, соответствующие одному из следующих типов:LOCALITY
SUBLOCALITY
POSTAL_CODE
COUNTRY
ADMINISTRATIVE_AREA_LEVEL_1
ADMINISTRATIVE_AREA_LEVEL_2
TypeFilter.CITIES
– Возвращает только результаты, соответствующиеLOCALITY
илиADMINISTRATIVE_AREA_LEVEL_3
.
-
Необязательно: значение
LatLng
, указывающее местоположение отправителя запроса. При вызовеsetOrigin()
сервис возвращает расстояние в метрах (distanceMeters
) от указанной отправителя для каждого подсказки автодополнения в ответе.
Информацию о типах мест см. в руководстве по типам мест .
В примере ниже показан полный вызов PlacesClient.findAutocompletePredictions()
.
Котлин
// Create a new token for the autocomplete session. Pass this to FindAutocompletePredictionsRequest, // and once again when the user makes a selection (for example when calling fetchPlace()). val token = AutocompleteSessionToken.newInstance() // Create a RectangularBounds object. val bounds = RectangularBounds.newInstance( LatLng(-33.880490, 151.184363), LatLng(-33.858754, 151.229596) ) // Use the builder to create a FindAutocompletePredictionsRequest. val request = FindAutocompletePredictionsRequest.builder() // Call either setLocationBias() OR setLocationRestriction(). .setLocationBias(bounds) //.setLocationRestriction(bounds) .setOrigin(LatLng(-33.8749937, 151.2041382)) .setCountries("AU", "NZ") .setTypesFilter(listOf(PlaceTypes.ADDRESS)) .setSessionToken(token) .setQuery(query) .build() placesClient.findAutocompletePredictions(request) .addOnSuccessListener { response: FindAutocompletePredictionsResponse -> for (prediction in response.autocompletePredictions) { Log.i(TAG, prediction.placeId) Log.i(TAG, prediction.getPrimaryText(null).toString()) } }.addOnFailureListener { exception: Exception? -> if (exception is ApiException) { Log.e(TAG, "Place not found: ${exception.statusCode}") } }
Ява
// Create a new token for the autocomplete session. Pass this to FindAutocompletePredictionsRequest, // and once again when the user makes a selection (for example when calling fetchPlace()). AutocompleteSessionToken token = AutocompleteSessionToken.newInstance(); // Create a RectangularBounds object. RectangularBounds bounds = RectangularBounds.newInstance( new LatLng(-33.880490, 151.184363), new LatLng(-33.858754, 151.229596)); // Use the builder to create a FindAutocompletePredictionsRequest. FindAutocompletePredictionsRequest request = FindAutocompletePredictionsRequest.builder() // Call either setLocationBias() OR setLocationRestriction(). .setLocationBias(bounds) //.setLocationRestriction(bounds) .setOrigin(new LatLng(-33.8749937, 151.2041382)) .setCountries("AU", "NZ") .setTypesFilter(Arrays.asList(PlaceTypes.ADDRESS)) .setSessionToken(token) .setQuery(query) .build(); placesClient.findAutocompletePredictions(request).addOnSuccessListener((response) -> { for (AutocompletePrediction prediction : response.getAutocompletePredictions()) { Log.i(TAG, prediction.getPlaceId()); Log.i(TAG, prediction.getPrimaryText(null).toString()); } }).addOnFailureListener((exception) -> { if (exception instanceof ApiException) { ApiException apiException = (ApiException) exception; Log.e(TAG, "Place not found: " + apiException.getStatusCode()); } });
API возвращает FindAutocompletePredictionsResponse
в Task
. FindAutocompletePredictionsResponse
содержит список объектов AutocompletePrediction
, представляющих предсказанные места. Список может быть пустым, если нет известного места, соответствующего запросу и критериям фильтра.
Для каждого предсказанного места вы можете вызвать следующие методы для получения сведений о месте:
-
getFullText(CharacterStyle)
возвращает полный текст описания места. Это комбинация основного и дополнительного текста. Пример: « Эйфелева башня, авеню Анатоля Франса, Париж, Франция ». Кроме того, этот метод позволяет выделить разделы описания, соответствующие поисковому запросу, с помощью стиля по вашему выбору с помощьюCharacterStyle
. ПараметрCharacterStyle
необязателен. Установите его в null, если выделение не требуется. -
getPrimaryText(CharacterStyle)
возвращает основной текст, описывающий место. Обычно это название места. Примеры: « Эйфелева башня » и « Питт-стрит, 123 ». -
getSecondaryText(CharacterStyle)
возвращает дополнительный текст описания места. Это полезно, например, в качестве второй строки при показе подсказок автодополнения. Примеры: « Авеню Анатоля Франса, Париж, Франция » и « Сидней, Новый Южный Уэльс ». -
getPlaceId()
возвращает идентификатор предсказанного места. Идентификатор места — это текстовый идентификатор, который уникально идентифицирует место и может быть использован для последующего получения объектаPlace
. Подробнее об идентификаторах мест в Places SDK для Android см. в разделе «Подробности места» . Общую информацию об идентификаторах мест см. в разделе «Обзор идентификаторов места» . -
getPlaceTypes()
возвращает список типов мест, связанных с этим местом. -
getDistanceMeters()
возвращает расстояние по прямой в метрах между данным местом и точкой начала координат, указанной в запросе.
Токены сеанса
Токены сеанса объединяют фазы запроса и выбора в рамках поиска с автодополнением пользователя в отдельный сеанс для целей выставления счетов. Сеанс начинается с момента начала ввода запроса и заканчивается выбором места. В каждом сеансе может быть выполнено несколько запросов, за которыми следует выбор одного места. После завершения сеанса токен становится недействительным; ваше приложение должно генерировать новый токен для каждого сеанса. Мы рекомендуем использовать токены сеанса для всех сеансов программного автодополнения (при встраивании фрагмента или запуске автодополнения с помощью намерения API делает это автоматически).
В Places SDK для Android используется AutocompleteSessionToken
для идентификации каждого сеанса. Ваше приложение должно передавать новый токен сеанса при начале каждого нового сеанса, а затем передавать этот же токен вместе с идентификатором места в последующем вызове fetchPlace()
для получения информации о месте, выбранном пользователем.
Узнайте больше о токенах сеанса .
Ограничить результаты автозаполнения
Вы можете ограничить результаты автозаполнения определенным географическим регионом и/или отфильтровать их по одному или нескольким типам мест или по пяти странам. Эти ограничения можно применить к активности автозаполнения, AutocompleteSupportFragment
и API программного автозаполнения.
Чтобы ограничить результаты, выполните следующие действия:
- Чтобы отдать предпочтение результатам в пределах определенного региона, вызовите
setLocationBias()
(некоторые результаты за пределами определенного региона все равно могут быть возвращены). - Чтобы отобразить результаты только в пределах определенного региона, вызовите
setLocationRestriction()
(будут возвращены только результаты только в пределах определенного региона). - Чтобы вернуть только результаты, соответствующие определенному типу места, вызовите
setTypesFilter()
(например, указаниеTypeFilter.ADDRESS
вернет только результаты с точным адресом). - Чтобы вернуть результаты только по пяти указанным странам, вызовите
setCountries()
. Страны должны быть переданы как двухсимвольный код , совместимый со стандартом ISO 3166-1 Alpha-2 .
Результаты смещения в сторону конкретного региона
Чтобы сместить результаты автодополнения в сторону определённого географического региона, вызовите setLocationBias()
, передав RectangularBounds
. В следующем примере кода показан вызов setLocationBias()
для экземпляра фрагмента, чтобы сместить предложения автодополнения в сторону региона Сидней, Австралия.
Котлин
autocompleteFragment.setLocationBias( RectangularBounds.newInstance( LatLng(-33.880490, 151.184363), LatLng(-33.858754, 151.229596) ) )
Ява
autocompleteFragment.setLocationBias(RectangularBounds.newInstance( new LatLng(-33.880490, 151.184363), new LatLng(-33.858754, 151.229596)));
Ограничить результаты определенным регионом
Чтобы ограничить результаты автодополнения определённым географическим регионом, вызовите setLocationRestriction()
, передав RectangularBounds
. В следующем примере кода показан вызов setLocationRestriction()
для экземпляра фрагмента, чтобы сместить предложения автодополнения в сторону Сиднея, Австралия.
Котлин
autocompleteFragment.setLocationRestriction( RectangularBounds.newInstance( LatLng(-33.880490, 151.184363), LatLng(-33.858754, 151.229596) ) )
Ява
autocompleteFragment.setLocationRestriction(RectangularBounds.newInstance( new LatLng(-33.880490, 151.184363), new LatLng(-33.858754, 151.229596)));
Примечание: это ограничение применяется только к целым маршрутам, синтетические результаты, находящиеся за пределами прямоугольных границ, могут быть возвращены на основе маршрута, который перекрывается ограничением местоположения.
Фильтрация результатов по типам мест или коллекции типов
Вы можете ограничить результаты запроса автозаполнения, чтобы они возвращали только определённый тип места. Задайте фильтр, используя типы мест или коллекцию типов, перечисленных в таблицах 1, 2 и 3 в разделе «Типы мест» . Если ничего не указано, возвращаются все типы.
Чтобы отфильтровать результаты автозаполнения, вызовите setTypesFilter()
для установки фильтра.
Чтобы указать тип или фильтр коллекции типов:
Вызовите метод
setTypesFilter()
и укажите до пяти значений типа из таблиц 1 и 2, представленных в Place Types . Значения типа определяются константами в PlaceTypes .Вызовите метод
setTypesFilter()
и укажите коллекцию типов из таблицы 3, представленной в разделе «Типы мест» . Значения коллекции определяются константами в PlaceTypes .В запросе допускается только один тип из Таблицы 3. Если указано значение из Таблицы 3, нельзя указать значение из Таблицы 1 или Таблицы 2. В противном случае возникнет ошибка.
В следующем примере кода вызывается setTypesFilter()
для AutocompleteSupportFragment
и указывается несколько значений типа.
Котлин
autocompleteFragment.setTypesFilter(listOf("landmark", "restaurant", "store"))
Ява
autocompleteFragment.setTypesFilter(Arrays.asList("landmark", "restaurant", "store"));
В следующем примере кода показан вызов setTypesFilter()
для AutocompleteSupportFragment
для установки фильтра, возвращающего только результаты с точным адресом, путем указания коллекции типов.
Котлин
autocompleteFragment.setTypesFilter(listOf(PlaceTypes.ADDRESS))
Ява
autocompleteFragment.setTypesFilter(Arrays.asList(PlaceTypes.ADDRESS, PlaceTypes.ESTABLISHMENT));
В следующем примере кода показан вызов setTypesFilter()
в IntentBuilder
для установки фильтра, возвращающего только результаты с точным адресом, путем указания коллекции типов.
Котлин
val intent = Autocomplete.IntentBuilder(AutocompleteActivityMode.FULLSCREEN, fields) .setTypesFilter(listOf(PlaceTypes.ADDRESS)) .build(this)
Ява
Intent intent = new Autocomplete.IntentBuilder( AutocompleteActivityMode.FULLSCREEN, fields) .setTypesFilter(Arrays.asList(PlaceTypes.ADDRESS)) .build(this);
Фильтровать результаты по стране
Чтобы отфильтровать результаты автозаполнения по пяти странам, вызовите setCountries()
чтобы задать код страны . Затем передайте фильтр фрагменту или намерению. Страны должны быть переданы как двухсимвольный код страны , совместимый со стандартом ISO 3166-1 Alpha-2.
В следующем примере кода показан вызов setCountries()
для AutocompleteSupportFragment
для установки фильтра, возвращающего только результаты в пределах указанных стран.
Котлин
autocompleteFragment.setCountries("AU", "NZ")
Ява
autocompleteFragment.setCountries("AU", "NZ");
Ограничения по использованию
Использование Places API, включая Places SDK для Android, больше не ограничено максимальным количеством запросов в день (QPD). Однако по-прежнему действуют следующие ограничения:
- Ограничение скорости составляет 6000 запросов в минуту (QPM). Оно рассчитывается как сумма клиентских и серверных запросов для всех приложений, использующих учетные данные одного проекта.
Отображение атрибуции в вашем приложении
- Если ваше приложение использует службу автозаполнения программно, ваш пользовательский интерфейс должен либо отображать атрибуцию «Powered by Google», либо отображаться на карте с логотипом Google.
- Если ваше приложение использует виджет автозаполнения, никаких дополнительных действий не требуется (требуемая атрибуция отображается по умолчанию).
- Если вы извлекаете и отображаете дополнительную информацию о месте после получения места по идентификатору , вы также должны отображать сторонние атрибуции.
Более подробную информацию см. в документации по атрибуции .
Оптимизация автозаполнения (устаревшая версия)
В этом разделе описываются рекомендации, которые помогут вам максимально эффективно использовать услугу Place Autocomplete (устаревшая версия).
Вот некоторые общие рекомендации:
- Самый быстрый способ разработать рабочий пользовательский интерфейс — использовать виджет Maps JavaScript API Place Autocomplete (Legacy) , виджет Place Autocomplete (Legacy) Places SDK for Android или элемент управления пользовательского интерфейса Place Autocomplete (Legacy) Place SDK for iOS
- С самого начала изучите основные поля данных Place Autocomplete (Legacy).
- Поля смещения местоположения и ограничения местоположения являются необязательными, но могут оказать существенное влияние на производительность автозаполнения.
- Используйте обработку ошибок, чтобы гарантировать корректную работу приложения в случае, если API возвращает ошибку.
- Убедитесь, что ваше приложение обрабатывает ситуацию, когда выбора нет, и предлагает пользователям возможность продолжить.
Лучшие практики оптимизации затрат
Базовая оптимизация затрат
Чтобы оптимизировать стоимость использования сервиса автозаполнения мест (устаревшая версия), используйте маски полей в виджетах «Сведения о месте (устаревшая версия)» и «Автозаполнение мест (устаревшая версия)», чтобы возвращать только необходимые вам поля данных о местах .
Расширенная оптимизация затрат
Рассмотрите возможность программной реализации автозаполнения мест (Place Autocomplete, устаревшая версия) для доступа к ценам Per Request и запроса результатов Geocoding API о выбранном месте вместо Place Details (устаревшая версия). Стоимость Per Request в сочетании с Geocoding API более экономична, чем Per Session (на основе сеансов), если выполняются оба следующих условия:
- Если вам нужны только широта/долгота или адрес выбранного пользователем места, API геокодирования предоставит эту информацию менее чем за один вызов Place Details (Legacy).
- Если пользователи выбирают прогноз автозаполнения в среднем в течение четырех запросов прогнозов Place Autocomplete (Legacy) или менее, цена за запрос может быть более экономически эффективной, чем цена за сеанс.
Требуется ли для вашего приложения какая-либо информация, помимо адреса и широты/долготы выбранного прогноза?
Да, нужно больше подробностей
Используйте функцию автозаполнения мест на основе сеанса (устаревшая версия) с подробностями мест (устаревшая версия).
Поскольку вашему приложению требуются сведения о месте (устаревшие), такие как название места, статус компании или часы работы, ваша реализация автозаполнения места (устаревшие) должна использовать токен сеанса ( программно или встроенный в виджеты JavaScript , Android или iOS ) на сеанс , а также применимые SKU данных места в зависимости от того, какие поля данных о месте вы запрашиваете. 1
Реализация виджета
Управление сеансами автоматически встроено в виджеты JavaScript , Android или iOS . Это включает как запросы Place Autocomplete (устаревшие), так и запросы Place Details (устаревшие) для выбранной подсказки. Обязательно укажите параметр fields
, чтобы убедиться, что вы запрашиваете только необходимые поля данных о месте .
Программная реализация
Используйте токен сеанса в запросах Place Autocomplete (Legacy). При запросе Place Details (Legacy) для выбранного прогноза включите следующие параметры:
- Идентификатор места из ответа Place Autocomplete (устаревшая версия)
- Токен сеанса, используемый в запросе Place Autocomplete (Legacy)
- Параметр
fields
указывающий, где находятся нужные вам поля данных
Нет, нужен только адрес и местонахождение
Использование API геокодирования может быть более экономичным вариантом, чем Place Details (Legacy), для вашего приложения, в зависимости от производительности Place Autocomplete (Legacy). Эффективность Place Autocomplete (Legacy) в каждом приложении варьируется в зависимости от того, какие данные вводят пользователи, где используется приложение и были ли реализованы лучшие практики оптимизации производительности .
Чтобы ответить на следующий вопрос, проанализируйте, сколько символов в среднем вводит пользователь, прежде чем выбрать подсказку «Разместить автозаполнение (устаревшее)» в своем приложении.
Выбирают ли ваши пользователи в среднем подсказку Place Autocomplete (Legacy) в четырех или менее запросах?
Да
Реализуйте функцию автозаполнения мест (устаревшую) программно без токенов сеанса и вызовите API геокодирования для выбранного прогноза места.
API геокодирования предоставляет адреса и координаты широты/долготы. Выполнение четырёх запросов Place Autocomplete (Legacy) - Per Request плюс вызов API геокодирования для прогнозирования выбранного места обходится дешевле, чем стоимость одного сеанса Place Autocomplete (Legacy) за сеанс. 1
Рассмотрите возможность применения лучших методов повышения производительности , чтобы помочь вашим пользователям получить нужный им прогноз, используя еще меньше символов.
Нет
Используйте функцию автозаполнения мест на основе сеанса (устаревшая версия) с подробностями мест (устаревшая версия).
Поскольку среднее количество запросов, которые вы ожидаете сделать, прежде чем пользователь выберет прогноз Place Autocomplete (Legacy), превышает стоимость тарификации Per Session, ваша реализация Place Autocomplete (Legacy) должна использовать токен сеанса как для запросов Place Autocomplete (Legacy), так и для связанного запроса Place Details (Legacy) за сеанс . 1
Реализация виджета
Управление сеансами автоматически встроено в виджеты JavaScript , Android или iOS . Это включает как запросы Place Autocomplete (устаревшие), так и запросы Place Details (устаревшие) для выбранной подсказки. Обязательно укажите параметр fields
, чтобы убедиться, что запрашиваются только поля с базовыми данными .
Программная реализация
Используйте токен сеанса в запросах Place Autocomplete (Legacy). При запросе Place Details (Legacy) для выбранного прогноза включите следующие параметры:
- Идентификатор места из ответа Place Autocomplete (устаревшая версия)
- Токен сеанса, используемый в запросе Place Autocomplete (Legacy)
- Параметр
fields
задающий поля базовых данных , такие как адрес и геометрия.
Рассмотрите возможность отсрочки запросов Place Autocomplete (Legacy)
Вы можете использовать такие стратегии, как отсрочка запроса Place Autocomplete (Legacy) до тех пор, пока пользователь не введёт первые три или четыре символа, чтобы ваше приложение выполняло меньше запросов. Например, выполнение запросов Place Autocomplete (Legacy) для каждого символа после ввода третьего символа означает, что если пользователь введёт семь символов, а затем выберет подсказку, для которой вы сделаете один запрос к Geocoding API, общая стоимость составит 4 Place Autocomplete (Legacy) на запрос + Geocoding. 1
Если задержка запросов позволяет снизить среднее количество программных запросов до уровня ниже четырёх, вы можете следовать рекомендациям по эффективной реализации Place Autocomplete (устаревшая версия) с API геокодирования . Обратите внимание, что задержка запросов может восприниматься пользователем как задержка, поскольку он ожидает видеть подсказки при каждом нажатии клавиши.
Рассмотрите возможность применения лучших методов повышения производительности , чтобы помочь вашим пользователям получить нужный им прогноз, используя меньше символов.
Информацию о стоимости см. в прайс-листах платформы Google Maps .
Лучшие практики производительности
В следующих рекомендациях описываются способы оптимизации производительности Place Autocomplete (устаревшей версии):
- Добавьте ограничения по странам, смещение местоположения и (для программных реализаций) языковые настройки в вашу реализацию Place Autocomplete (устаревшую). Языковые настройки не требуются для виджетов, поскольку они выбирают языковые настройки из браузера или мобильного устройства пользователя.
- Если функция автозаполнения места (устаревшая) сопровождается картой, вы можете смещать местоположение в зависимости от области просмотра карты.
- В ситуациях, когда пользователь не выбирает одно из предсказаний Place Autocomplete (устаревшее), как правило, потому, что ни одно из этих предсказаний не является желаемым адресом результата, вы можете повторно использовать исходный пользовательский ввод, чтобы попытаться получить более релевантные результаты:
- Если вы ожидаете, что пользователь введет только адресную информацию, повторно используйте исходный пользовательский ввод в вызове API геокодирования .
- Если вы ожидаете, что пользователь будет вводить запросы для поиска конкретного места по названию или адресу, используйте запрос Find Place (Legacy) . Если результаты ожидаются только в определённом регионе, используйте смещение местоположения .
- Пользователи, вводящие адреса отдельных помещений, например, адреса отдельных квартир или помещений в здании. Например, чешский адрес «Stroupežnického 3191/17, Praha» даёт частичный подсказчик в функции автозаполнения мест (устаревшая версия).
- Пользователи вводят адреса с префиксами сегментов дорог, например, «23-30 29th St, Queens» в Нью-Йорке или «47-380 Kamehameha Hwy, Kaneohe» на острове Кауаи на Гавайях.
Поиск неисправностей
Хотя ошибки могут возникать самые разные, большинство из них, скорее всего, вызваны ошибками конфигурации (например, использован неверный ключ API или он был неправильно настроен) или ошибками квот (ваше приложение превысило квоту). Подробнее о квотах см. в разделе «Ограничения использования» .
Ошибки, возникающие при использовании элементов управления автозаполнением, возвращаются в обратном вызове onActivityResult()
. Вызовите Autocomplete.getStatus()
, чтобы получить сообщение о состоянии результата.