Текущее место

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

Используя Places SDK для Android, вы можете обнаружить место в текущем местоположении устройства. Примерами мест являются местные предприятия, достопримечательности и географические местоположения.

Разрешения

Для использования библиотеки вам не нужно объявлять какие-либо дополнительные разрешения в манифесте вашего приложения, так как библиотека объявляет все разрешения, которые она использует, в своем манифесте. Однако, если ваше приложение использует PlacesClient.findCurrentPlace() , вы должны запросить разрешения на местоположение во время выполнения.

Если ваше приложение не использует PlacesClient.findCurrentPlace() , явно удалите разрешения ACCESS_FINE_LOCATION и ACCESS_COARSE_LOCATION предоставленные библиотекой, добавив в манифест следующее:

<manifest ... xmlns:tools="http://schemas.android.com/tools">
    ...
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" tools:node="remove"/>
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" tools:node="remove"/>
    ...
</manifest>

Узнайте больше о разрешениях и рассмотрите возможность использования EasyPermissions для начала работы.

Получить текущее местоположение

Чтобы найти местное предприятие или другое место, где в данный момент находится устройство, выполните следующие действия:

  1. Вызовите ContextCompat.checkSelfPermission , чтобы проверить, предоставил ли пользователь разрешение на доступ к местоположению своего устройства. Ваше приложение также должно включать код для запроса разрешения у пользователя и обработки результата. Подробнее см. в разделе Запрос разрешений приложения .
  2. Создайте FindCurrentPlaceRequest , передав List Place.Field , указав типы данных о местах, которые должно запрашивать ваше приложение.
  3. Вызовите PlacesClient.findCurrentPlace() , передав FindCurrentPlaceRequest , созданный на предыдущем шаге.
  4. Получите список PlaceLikelihood из FindCurrentPlaceResponse .

Поля соответствуют результатам поиска мест и делятся на три категории выставления счетов: Basic, Contact и Atmosphere. Базовые поля оплачиваются по базовой ставке и не влекут за собой дополнительных расходов. Поля Contact и Atmosphere оплачиваются по более высокой ставке. Для получения дополнительной информации о том, как оплачиваются запросы данных мест, см. раздел Использование и выставление счетов .

API возвращает FindCurrentPlaceResponse в Task . FindCurrentPlaceResponse содержит список объектов PlaceLikelihood , представляющих места, где устройство может находиться. Для каждого места результат включает указание вероятности того, что это место является правильным. Список может быть пустым, если нет известного места, соответствующего данному местоположению устройства.

Вы можете вызвать PlaceLikelihood.getPlace() , чтобы получить объект Place , и PlaceLikelihood.getLikelihood() , чтобы получить рейтинг вероятности места. Более высокое значение означает большую вероятность того, что место является наилучшим совпадением.

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

Котлин

// Use fields to define the data types to return.
val placeFields: List<Place.Field> = listOf(Place.Field.NAME)

// Use the builder to create a FindCurrentPlaceRequest.
val request: FindCurrentPlaceRequest = FindCurrentPlaceRequest.newInstance(placeFields)

// Call findCurrentPlace and handle the response (first check that the user has granted permission).
if (ContextCompat.checkSelfPermission(this, permission.ACCESS_FINE_LOCATION) ==
    PackageManager.PERMISSION_GRANTED) {

    val placeResponse = placesClient.findCurrentPlace(request)
    placeResponse.addOnCompleteListener { task ->
        if (task.isSuccessful) {
            val response = task.result
            for (placeLikelihood: PlaceLikelihood in response?.placeLikelihoods ?: emptyList()) {
                Log.i(
                    TAG,
                    "Place '${placeLikelihood.place.name}' has likelihood: ${placeLikelihood.likelihood}"
                )
            }
        } else {
            val exception = task.exception
            if (exception is ApiException) {
                Log.e(TAG, "Place not found: ${exception.statusCode}")
            }
        }
    }
} else {
    // A local method to request required permissions;
    // See https://developer.android.com/training/permissions/requesting
    getLocationPermission()
}

      

Ява

// Use fields to define the data types to return.
List<Place.Field> placeFields = Collections.singletonList(Place.Field.NAME);

// Use the builder to create a FindCurrentPlaceRequest.
FindCurrentPlaceRequest request = FindCurrentPlaceRequest.newInstance(placeFields);

// Call findCurrentPlace and handle the response (first check that the user has granted permission).
if (ContextCompat.checkSelfPermission(this, ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) {
    Task<FindCurrentPlaceResponse> placeResponse = placesClient.findCurrentPlace(request);
    placeResponse.addOnCompleteListener(task -> {
        if (task.isSuccessful()){
            FindCurrentPlaceResponse response = task.getResult();
            for (PlaceLikelihood placeLikelihood : response.getPlaceLikelihoods()) {
                Log.i(TAG, String.format("Place '%s' has likelihood: %f",
                    placeLikelihood.getPlace().getName(),
                    placeLikelihood.getLikelihood()));
            }
        } else {
            Exception exception = task.getException();
            if (exception instanceof ApiException) {
                ApiException apiException = (ApiException) exception;
                Log.e(TAG, "Place not found: " + apiException.getStatusCode());
            }
        }
    });
} else {
    // A local method to request required permissions;
    // See https://developer.android.com/training/permissions/requesting
    getLocationPermission();
}

      

Примечания о значениях вероятности:

  • Вероятность обеспечивает относительную вероятность того, что место будет наилучшим совпадением в списке возвращенных мест для одного запроса. Вы не можете сравнивать вероятности по разным запросам.
  • Значение вероятности будет находиться в диапазоне от 0,0 до 1,0.

Например, чтобы представить 55%-ную вероятность того, что правильным местом является место A, и 35%-ную вероятность того, что это место B, ответ содержит два элемента: место A с вероятностью 0,55 и место B с вероятностью 0,35.

Отображение атрибуции в вашем приложении

Когда ваше приложение отображает информацию, полученную от PlacesClient.findCurrentPlace() , приложение также должно отображать атрибуции. См. документацию по атрибуциям .