Используя 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 , чтобы начать работу.
Получить текущее местоположение
Чтобы найти местный бизнес или другое место, где в данный момент находится устройство, выполните следующие действия:
- Вызовите
ContextCompat.checkSelfPermission
, чтобы проверить, предоставил ли пользователь разрешение на доступ к местоположению своего устройства. Ваше приложение также должно включать код, запрашивающий у пользователя разрешение и обрабатывающий результат. Подробности см. в разделе «Запрос разрешений приложения» . - Создайте
FindCurrentPlaceRequest
, передавList
Place.Field
, указав типы данных места, которые должно запрашивать ваше приложение. - Вызовите
PlacesClient.findCurrentPlace()
, передавFindCurrentPlaceRequest
, созданный на предыдущем шаге. - Получите список
PlaceLikelihood
изFindCurrentPlaceResponse
.
Поля соответствуют результатам поиска мест и разделены на три платежные категории: «Базовый», «Контакт» и «Атмосфера». Базовые поля оплачиваются по базовой ставке и не требуют дополнительных затрат. Поля «Контакт» и «Атмосфера» оплачиваются по более высокой ставке. Дополнительную информацию о том, как оплачиваются запросы данных о местах, см. в разделе «Использование и выставление счетов» .
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%-ную вероятность того, что правильным местом является место А, и 35%-ную вероятность того, что это место Б, в ответе есть два элемента: место А с вероятностью 0,55 и место Б с вероятностью 0,35.
Отображение авторства в вашем приложении
Когда ваше приложение отображает информацию, полученную с помощью PlacesClient.findCurrentPlace()
, приложение также должно отображать атрибуцию. См. документацию по атрибуции .