С помощью 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
.
Поля соответствуют результатам поиска Place и делятся на три категории тарификации: Basic, Contact и Atmosphere. Базовые поля тарифицируются по базовой ставке и не требуют дополнительной оплаты. Поля Contact и Atmosphere тарифицируются по более высокой ставке. Подробнее о тарифицировании запросов данных Place см. в разделе «Использование и тарификация» .
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()
, оно также должно отображать информацию об атрибуции. См. документацию по атрибуции .