Автозаполнение мест (устаревшая версия)

Разработчики из Европейской экономической зоны (ЕЭЗ)

Автозаполнение мест (устаревшая версия) возвращает подсказки мест в ответ на поисковые запросы пользователей. По мере ввода текста сервис автозаполнения предлагает варианты мест, например компаний, адресов, кодов Plus Code и объектов инфраструктуры.

Добавить автозаполнение в приложение можно следующими способами:

Добавление виджета автозаполнения

Виджет автозаполнения – это диалоговое окно поиска со встроенной функцией автозаполнения. По мере того как пользователь вводит поисковые запросы, виджет предлагает список мест на выбор. Когда пользователь выбирает место, возвращается экземпляр Place, который приложение может использовать для получения сведений о выбранном месте.

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

Вариант 1. Встроить AutocompleteSupportFragment

Чтобы добавить AutocompleteSupportFragment в приложение, выполните следующие действия:

  1. Добавьте фрагмент в XML-макет действия.
  2. Добавьте прослушиватель в объект activity или фрагмент.

Как добавить 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.
  • Если вы используете фрагмент автозаполнения и вам нужно переопределить onActivityResult, вызовите super.onActivityResult, иначе фрагмент не будет работать правильно.

Добавление PlaceSelectionListener в действие

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

Kotlin

    // Build a BasicPlaceAutocomplete intent to allow the user to select a place.
    val basicAutocompleteIntent = BasicPlaceAutocomplete.createIntent(this) {
        setCountries(listOf("AU", "NZ"))
    }

      

Java

    // Build a BasicPlaceAutocomplete intent to allow the user to select a place.
    Intent basicAutocompleteIntent =
            new BasicPlaceAutocomplete.IntentBuilder()
                    .setCountries(List.of("AU", "NZ"))
                    .build(this);

      

Вариант 2. Использование намерения для запуска действия автозаполнения

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

Чтобы запустить виджет службы подсказки мест с помощью объекта Intent, выполните следующие действия.

  1. Чтобы создать намерение, используйте Autocomplete.IntentBuilder, передав нужный режим Autocomplete.
  2. Определите средство запуска результата объекта activity registerForActivityResult, которое можно использовать для запуска намерения и обработки выбранной пользователем подсказки места в результате.

Как создать намерение автозаполнения

В примере ниже используется Autocomplete.IntentBuilder для создания намерения, запускающего виджет автозаполнения.

Kotlin

    val intent = PlaceAutocomplete.createIntent(this) {
        setTypesFilter(listOf(PlaceTypes.ESTABLISHMENT))
    }

    startAutocomplete.launch(intent)

      

Java

    // Start the autocomplete intent.
    Intent intent =
            new PlaceAutocomplete.IntentBuilder()
                    .setTypesFilter(List.of(PlaceTypes.ESTABLISHMENT))
                    .build(this);
    startAutocomplete.launch(intent);

      

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

В режиме наложения виджет автозаполнения появляется поверх вызывающего интерфейса.
Рисунок 1. Виджет Autocomplete в режиме OVERLAY
В полноэкранном режиме виджет автозаполнения занимает весь экран.
Рисунок 2. Виджет автозаполнения в режиме FULLSCREEN

Зарегистрируйте обратный вызов для результата намерения

Чтобы получать уведомления о том, что пользователь выбрал место, определите средство запуска registerForActivityResult(), которое запускает объект activity и обрабатывает результат, как показано в примере ниже. Если пользователь выбрал подсказку, она будет содержаться в интенте, который содержится в объекте результата. Поскольку объект intent был построен объектом Autocomplete.IntentBuilder, метод Autocomplete.getPlaceFromIntent() может извлечь из него объект Place.

Kotlin

private val startAutocomplete =
    registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result: ActivityResult ->
        if (result.resultCode == RESULT_OK) {
            val intent = result.data
            if (intent != null) {
                val prediction = PlaceAutocomplete.getPredictionFromIntent(intent)
                if (prediction != null) {
                    binding.autocompleteResult.text = getString(
                        R.string.place_selection,
                        prediction.getPrimaryText(null),
                        prediction.placeId,
                        prediction.getSecondaryText(null),
                    )
                    Log.i(
                        TAG,
                        "Place: ${prediction.getPrimaryText(null)}, ${prediction.placeId}",
                    )
                }
            }
        } else if (result.resultCode == RESULT_CANCELED) {
            // The user canceled the operation.
            binding.autocompleteResult.setText(R.string.user_canceled_autocomplete)
            Log.i(TAG, "User canceled autocomplete")
        } else if (result.resultCode == PlacesSdkAutocompleteActivity.RESULT_ERROR) {
            val intent = result.data
            if (intent != null) {
                val status = PlaceAutocomplete.getResultStatusFromIntent(intent)
                Log.e(TAG, "An error occurred: ${status?.statusMessage}")
            }
        }
    }

      

Java

private final ActivityResultLauncher<Intent> startAutocomplete =
        registerForActivityResult(
                new ActivityResultContracts.StartActivityForResult(),
                result -> {
                    if (result.getResultCode() == Activity.RESULT_OK) {
                        Intent intent = result.getData();
                        if (intent != null) {
                            AutocompletePrediction prediction =
                                    PlaceAutocomplete.getPredictionFromIntent(intent);
                            if (prediction != null) {
                                binding.autocompleteResult.setText(
                                        getString(
                                                R.string.place_selection,
                                                prediction.getPrimaryText(null),
                                                prediction.getPlaceId(),
                                                prediction.getSecondaryText(null)));
                                Log.i(
                                        TAG,
                                        "Place: "
                                                + prediction.getPrimaryText(null)
                                                + ", "
                                                + prediction.getPlaceId());
                            }
                        }
                    } else if (result.getResultCode() == Activity.RESULT_CANCELED) {
                        // The user canceled the operation.
                        binding.autocompleteResult.setText(R.string.user_canceled_autocomplete);
                        Log.i(TAG, "User canceled autocomplete");
                    } else if (result.getResultCode()
                            == com.google.android.libraries.places.widget
                                    .PlaceAutocompleteActivity.RESULT_ERROR) {
                        Intent intent = result.getData();
                        if (intent != null) {
                            Status status = PlaceAutocomplete.getResultStatusFromIntent(intent);
                            if (status != null) {
                                Log.e(TAG, "An error occurred: " + status.getStatusMessage());
                            }
                        }
                    }
                });


      

Как программно получить подсказки мест

Вы можете создать собственный интерфейс поиска вместо того, который предоставляется виджетом автозаполнения. Для этого ваше приложение должно получать подсказки мест программным способом. Чтобы получить список подсказок с названиями и/или адресами мест, приложение может вызвать метод 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().

Kotlin

    // 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.ESTABLISHMENT))
            .setSessionToken(token)
            .setQuery(query)
            .build()
    placesClient.findAutocompletePredictions(request)
        .addOnSuccessListener { response: FindAutocompletePredictionsResponse ->
            val builder = StringBuilder()
            for (prediction in response.autocompletePredictions) {
                builder.append(prediction.getPrimaryText(null).toString()).append("\n")
                Log.i(TAG, prediction.placeId)
                Log.i(TAG, prediction.getPrimaryText(null).toString())
            }
            binding.autocompleteResult.text = builder.toString()
        }.addOnFailureListener { exception: Exception? ->
            if (exception is ApiException) {
                Log.e(TAG, "Place not found: ${exception.statusCode}")
                binding.autocompleteResult.text = getString(R.string.place_not_found, exception.message)
            }
        }

      

Java

    // 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(List.of(PlaceTypes.ESTABLISHMENT))
                    .setSessionToken(token)
                    .setQuery(query)
                    .build();

    placesClient
            .findAutocompletePredictions(request)
            .addOnSuccessListener(
                    (response) -> {
                        StringBuilder builder = new StringBuilder();
                        for (AutocompletePrediction prediction :
                                response.getAutocompletePredictions()) {
                            builder.append(prediction.getPrimaryText(null).toString())
                                    .append("\n");
                            Log.i(TAG, prediction.getPlaceId());
                            Log.i(TAG, prediction.getPrimaryText(null).toString());
                        }
                        binding.autocompleteResult.setText(builder.toString());
                    })
            .addOnFailureListener(
                    (exception) -> {
                        if (exception instanceof ApiException apiException) {
                            Log.e(TAG, "Place not found: " + apiException.getStatusCode());
                            binding.autocompleteResult.setText(
                                    getString(
                                            R.string.place_not_found,
                                            apiException.getMessage()));
                        }
                    });

      

API возвращает FindAutocompletePredictionsResponse в Task. FindAutocompletePredictionsResponse содержит список объектов AutocompletePrediction, представляющих места, которые могут быть выбраны. Список может быть пустым, если нет известных мест, соответствующих запросу и критериям фильтра.

Для каждого места, предложенного в подсказке, можно вызвать следующие методы, чтобы получить подробную информацию о нем:

  • getFullText(CharacterStyle) возвращает полное текстовое описание места. Это сочетание основного и дополнительного текста. Пример: Эйфелева башня, авеню Анатоль Франс, Париж, Франция. Кроме того, этот метод позволяет выделить разделы описания, соответствующие поисковому запросу, с помощью стиля по вашему выбору, используя CharacterStyle. Параметр CharacterStyle необязателен. Если выделение не требуется, задайте значение null.
  • getPrimaryText(CharacterStyle) возвращает основной текст с описанием места. Обычно это название места. Примеры: Эйфелева башня, ул. Ленина, д. 123.
  • getSecondaryText(CharacterStyle) возвращает дополнительный текст описания места. Это удобно, например, для второй строки в подсказках автозаполнения. Примеры: Avenue Anatole France, Paris, France, Sydney, New South Wales.
  • 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() для экземпляра фрагмента, чтобы сместить подсказки автозаполнения в сторону Сиднея (Австралия).

Kotlin

        intentBuilder.setLocationBias(bounds)

      

Java

        intentBuilder.setLocationBias(
                RectangularBounds.newInstance(
                        new LatLng(-33.880490, 151.184363),
                        new LatLng(-33.858754, 151.229596)));

      

Как ограничить результаты определенным регионом

Чтобы ограничить результаты автозаполнения определенным географическим регионом, вызовите setLocationRestriction(), передав RectangularBounds. В примере кода ниже показан вызов setLocationRestriction() для экземпляра фрагмента, чтобы сместить подсказки автозаполнения в сторону Сиднея (Австралия).

Kotlin

        intentBuilder.setLocationRestriction(bounds)

      

Java

        intentBuilder.setLocationRestriction(
                RectangularBounds.newInstance(
                        new LatLng(-33.880490, 151.184363),
                        new LatLng(-33.858754, 151.229596)));

      

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

Как фильтровать результаты по типам мест или коллекциям типов

Вы можете ограничить результаты запроса автозаполнения, чтобы возвращались только места определенного типа. Укажите фильтр, используя типы мест или коллекцию типов, перечисленные в таблицах 1, 2 и 3 в статье Типы мест. Если ничего не указано, возвращаются все типы.

Чтобы отфильтровать результаты автозаполнения, вызовите setTypesFilter().

Чтобы указать фильтр по типу или коллекции типов, выполните следующие действия:

  • Вызовите метод setTypesFilter() и укажите до пяти значений type из таблицы 1 и таблицы 2 в статье Типы мест. Типы значений определяются константами в PlaceTypes.

  • Вызовите метод setTypesFilter() и укажите коллекцию типов из таблицы 3 в статье Типы мест. Значения коллекции определяются константами в PlaceTypes.

    В запросе допускается только один тип из таблицы 3. Если вы укажете значение из таблицы 3, значение из таблицы 1 или 2 указать нельзя. В противном случае возникнет ошибка.

В примере кода ниже вызывается setTypesFilter() для AutocompleteSupportFragment и указывается несколько значений типа.

Kotlin

    intentBuilder.setTypesFilter(listOf("landmark", "restaurant", "store"))

      

Java

    intentBuilder.setTypesFilter(List.of("landmark", "restaurant", "store"));

      

В примере ниже показано, как вызвать setTypesFilter() для AutocompleteSupportFragment, чтобы задать фильтр, возвращающий только результаты с точным адресом, указав коллекцию типов.

Kotlin

    intentBuilder.setTypesFilter(listOf(PlaceTypes.ADDRESS))

      

Java

    intentBuilder.setTypesFilter(List.of(PlaceTypes.ESTABLISHMENT));

      

В примере ниже показано, как вызвать setTypesFilter() для IntentBuilder, чтобы настроить фильтр, возвращающий только результаты с точным адресом, указав коллекцию типов.

Kotlin

    val intent = PlaceAutocomplete.createIntent(this) {
        setTypesFilter(listOf(PlaceTypes.ESTABLISHMENT))
    }

      

Java

    Intent intent =
            new PlaceAutocomplete.IntentBuilder()
                    .setTypesFilter(List.of(PlaceTypes.ESTABLISHMENT))
                    .build(this);

      

Фильтрация результатов по стране

Чтобы ограничить результаты автозаполнения пятью странами, вызовите setCountries() и задайте код страны. Затем передайте фильтр в фрагмент или объект Intent. Страны нужно указывать в виде двухбуквенного кода по стандарту ISO 3166-1 Alpha-2.

В примере ниже показано, как вызвать setCountries() для AutocompleteSupportFragment, чтобы задать фильтр, возвращающий только результаты в указанных странах.

Kotlin

    intentBuilder.setCountries(listOf("AU", "NZ"))

      

Java

    intentBuilder.setCountries(List.of("AU", "NZ"));

      

Лимиты на использование

Использование Places API (Legacy), включая Places SDK для Android (Legacy), больше не ограничено максимальным количеством запросов в день. Однако по-прежнему действуют следующие лимиты на использование:

  • Ограничение частоты запросов: 6000 запросов в минуту. Она рассчитывается как сумма клиентских и серверных запросов для всех приложений, использующих учетные данные одного проекта.

Указание авторства в приложении

  • Если ваше приложение использует сервис автозаполнения программно, в интерфейсе должна быть надпись "На базе Google" или карта с логотипом Google.
  • Если в вашем приложении используется виджет автозаполнения, никаких дополнительных действий не требуется (необходимая атрибуция отображается по умолчанию).
  • Если вы получаете и показываете дополнительную информацию о месте после получения места по идентификатору, вы также должны показывать атрибуцию третьих лиц.

Подробную информацию можно найти в документации по атрибуции.

Оптимизация автозаполнения мест (устаревшая версия)

В этом разделе приведены рекомендации по эффективному использованию устаревшего сервиса автозаполнения мест.

Рассмотрим некоторые общие рекомендации.

Рекомендации по оптимизации затрат

Базовая оптимизация затрат

Для оптимизации затрат на сервис автозаполнения мест (Legacy) используйте маски полей в виджетах информации о местах (Legacy) и автозаполнения мест (Legacy), чтобы они возвращали только нужные вам поля данных автозаполнения мест (Legacy).

Дополнительная оптимизация затрат

Рассмотрите возможность программно реализовать сервис Place Autocomplete (Legacy), чтобы получить доступ к тарифу Autocomplete – Per Request и запрашивать результаты Geocoding API о выбранном месте вместо Place Details (Legacy). Тариф Per Request в сочетании Geocoding API будет выгоднее, чем тариф Per Session (на основе сеансов), если соблюдаются два следующих условия:

  • Если вам нужны только широта и долгота или адрес выбранного пользователем места, получить эту информацию с помощью Geocoding API дешевле, чем вызывать Place Details (Legacy).
  • Если пользователи выбирают подсказку автозаполнения мест в среднем из первых четырех запросов автозаполнения мест (устаревшее) или из меньшего числа, тариф Per Request может быть выгоднее, чем Per Session.
Чтобы получить помощь в выборе подходящей реализации автозаполнения мест (Legacy), нажмите на вкладку, которая соответствует вашему ответу на приведенный ниже вопрос.

Требуется ли в вашем приложении какая-либо информация помимо адреса и широты и долготы выбранной подсказки?

Да, нужно больше сведений

Используйте сервис автозаполнения мест (устаревший) на основе сеансов совместно с информацией о местах (устаревшая версия).
Поскольку вашему приложению требуется информация о местах (устаревшая версия), например название места, статус компании или часы работы, в вашей реализации Place Autocomplete (устаревшая версия) должен использоваться токен сеанса (программно или встроенный в виджеты JavaScript, Android или iOS) за сеанс плюс применимые коды SKU данных о местах в зависимости от того, какие поля данных о местах вы запрашиваете.1

Реализация виджета
Функция автоматического управления сеансами встроена в виджеты для JavaScript, Android и iOS. В нее входят как запросы автозаполнения мест (Legacy), так и запрос информации о местах (Legacy) для выбранной подсказки. Обязательно укажите параметр fields, чтобы запрашивались только нужные поля данных автозаполнения мест (устаревшее).

Программная реализация
Используйте токен сеанса с запросами Place Autocomplete (Legacy). При запросе информации о местах (Legacy) по выбранной подсказке укажите следующие параметры:

  1. идентификатор места из ответа автозаполнения мест (устаревшая версия)
  2. токен сеанса, использованный в запросе автозаполнения мест (устаревшая версия);
  3. Параметр fields, указывающий нужные поля данных автозаполнения мест (устаревшее).

Нет, нужны только адрес и местоположение

Возможно, для вашего приложения Geocoding API будет более выгодным вариантом, чем Place Details (Legacy). Это зависит от того, насколько эффективно вы используете Place Autocomplete (Legacy). Эффективность функции автозаполнения мест (устаревшей) в каждом приложении зависит от того, какие запросы вводят пользователи, где используется приложение и реализованы ли рекомендации по оптимизации производительности.

Чтобы ответить на приведенный ниже вопрос, проанализируйте, сколько символов в среднем вводит пользователь, прежде чем выбирать подсказку автозаполнения мест (устаревшая версия) в приложении.

Выбирают ли пользователи подсказку автозаполнения мест (Legacy) в среднем из числа первых четырех запросов?

Да

Реализуйте автозаполнение мест (Legacy) программно без токенов сеансов и вызывайте Geocoding API для выбранной подсказки места.
Geocoding API предоставляет адреса и координаты широты и долготы. Четыре запроса Autocomplete – Per Request вместе с вызовом Geocoding API о выбранной подсказке места стоят меньше, чем один сеанс Place Autocomplete (Legacy) по тарифу за сеанс1.

Вы можете применить рекомендации по оптимизации эффективности, чтобы помочь пользователям получать нужные подсказки, вводя минимальное количество символов.

Нет

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

Реализация виджета
Функция автоматического управления сеансами встроена в виджеты для JavaScript, Android и iOS. В нее входят как запросы автозаполнения мест (Legacy), так и запрос информации о местах (Legacy) для выбранной подсказки. Обязательно укажите параметр fields, чтобы запрашивались только нужные поля.

Программная реализация
Используйте токен сеанса с запросами Place Autocomplete (Legacy). Запрашивая у Place Details (Legacy) информацию о выбранной подсказке, указывайте следующие параметры:

  1. идентификатор места из ответа автозаполнения мест (устаревшая версия)
  2. токен сеанса, использованный в запросе автозаполнения мест (устаревшая версия);
  3. Параметр fields, указывающий поля данных Basic Data, например адрес и геометрические данные.

Рассмотрите возможность откладывать запросы автозаполнения мест (Legacy)
Вы можете попробовать различные стратегии, например откладывать запрос автозаполнения мест (Legacy), пока пользователь не введет первые три или четыре символа, чтобы ваше приложение совершало меньше запросов. Например, если вы отправляете запросы Place Autocomplete (Legacy) для каждого символа после того, как пользователь ввел третий символ, то, если пользователь введет семь символов и выберет подсказку, для которой вы отправите один запрос Geocoding API, общая стоимость будет равна стоимости четырех запросов Place Autocomplete (Legacy) Per Request и одного запроса Geocoding API1.

Если при откладывании запросов среднее число автоматизированных запросов станет меньше четырех, вы сможете эффективно использовать сервис автозаполнения мест (Legacy) с Geocoding API. Обратите внимание, что пользователь, ожидающий появления подсказок с каждым введенным символом, может принять откладывание запросов за задержку.

Вы можете применить рекомендации по оптимизации эффективности, чтобы помочь пользователям получать нужные подсказки, вводя меньше символов.

Рекомендации по повышению эффективности

В рекомендациях ниже описаны способы оптимизации производительности автозаполнения мест (Legacy):

  • Добавьте в свою реализацию Place Autocomplete (Legacy) ограничения по стране, предпочтение местоположений и (для программных реализаций) предпочитаемый язык. Предпочитаемый язык не нужен в случае виджетов, потому что для них язык определяется на основе языковых настроек браузера или мобильного устройства.
  • Если вместе с автозаполнением мест (Legacy) отображается карта, вы можете сделать предпочитаемым местоположением видимую область карты.
  • Если пользователь не выберет ни одну из подсказок автозаполнения мест (Legacy) – чаще всего такое бывает, если ни одна из них не соответствует искомому адресу, — вы можете повторно использовать изначально введенные пользователем данные, чтобы получить более подходящие результаты:
    • Если вы рассчитываете, что пользователь будет вводить только информацию об адресе, повторно используйте изначально введенные им данные в вызове Geocoding API.
    • Если пользователь скорее всего будет вводить запросы для определенного места по названию или адресу, используйте запрос информации о местах (устаревший). Если ожидается, что результаты будут из определенного региона, используйте предпочтение местоположений.
    К другим сценариям, при которых лучше вернуться к использованию Geocoding API, относятся следующие:
    • Пользователи вводят адреса, содержащие номер квартиры или офиса. Так, для адреса в Чехии "Stroupežnického 3191/17, Praha" автозаполнение мест (устаревшее) покажет частичную подсказку.
    • Пользователь вводит адрес с префиксом для ряда домов, например "23-30 29th St, Queens" в Нью-Йорке или "47-380 Kamehameha Hwy, Kaneohe" на острове Кауаи (Гавайи).

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

Настроить предпочтение результатов из определенной области с помощью параметров location и radius. Это указывает автозаполнению мест (Legacy) предпочитать результаты в пределах заданной области. однако более отдаленные точки также могут быть включены в ответ. С помощью параметра includedRegionCodes можно отфильтровать результаты, чтобы в них показывались только места в указанной стране.

Ограничение местоположений

Ограничить результаты определенной областью, передав параметр locationRestriction.

Вы также можете ограничить результаты регионом, заданным параметрами location и radius, добавив параметр strictbounds. В этом случае автозаполнение мест (устаревшее) будет возвращать результаты только из указанного региона.

Устранение неполадок

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

Ошибки, возникающие при использовании элементов управления автозаполнением, возвращаются в обратном вызове onActivityResult(). Чтобы получить сообщение о статусе результата, вызовите Autocomplete.getStatus().