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

Выберите платформу: Android iOS

Используя 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 s, указав типы данных места, которые должно запрашивать ваше приложение.
  3. Вызовите PlacesClient.findCurrentPlace() , передав FindCurrentPlaceRequest , созданный на предыдущем шаге.
  4. Получите список PlaceLikelihood из FindCurrentPlaceResponse .

Поля соответствуют результатам поиска мест и разделены на три категории оплаты: «Основной», «Контакт» и «Атмосфера». Плата за основные поля взимается по базовому тарифу и не требует дополнительной оплаты. Поля «Контакт» и «Атмосфера» оплачиваются по более высокой ставке. Дополнительную информацию о том, как оплачиваются запросы данных Place, см. в разделе Использование и выставление счетов .

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

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

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

Джава


// 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();
}

      

Котлин


// 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()
}

      

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

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

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

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

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