Unlimited WordPress themes, graphics, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Code
  2. Android SDK
Code

Службы Google Play: использование Places API

Russian (Pусский) translation by Masha Kolesnikova (you can also view the original English article)

В марте 2015 года Google выпустил API-интерфейс Places для Android в составе Служб Google Play. Этот API позволяет разработчикам получать доступ к большому количеству информации из Google, чтобы предоставить пользователям опыт, соответствующий их текущему местоположению, используя имена и информацию о местах, а не набор координат.

В этом учебном пособии вы узнаете, как представить своих пользователей компоненту Place Picker, использовать API-интерфейс Places, чтобы угадать текущее место пользователя, найти место по его идентификатору и разрешить пользователю вводить текстовое поле для их представления с прогнозирующими результатами.

1. Настройка

Если у вас еще нет открытого ключа API для Android, вам нужно будет создать общедоступный ключ API Google для приложений Android. Вы можете сделать это, посетив Консоль разработчика Google. Инструкции по созданию ключа на основе вашего сертификата подписи и имени пакета доступны в документации Google и выходят за рамки этой статьи.

Когда вы создали ключ, найдите API-интерфейс Places и включите его. Некоторые вызовы API Places ограничены тем, сколько запросов может быть отправлено в течение 24-часового периода. На момент написания учетной записи учетная запись без профиля выставления счетов может отправлять до 1000 запросов, а учетная запись с профилем фактуры может отправлять 150 000 запросов. Если вам требуется больше, вы можете отправить запрос на увеличение этого лимита, как описано в документации по ограничениям использования.

Когда ключ API готов к использованию, пришло время начать работу над демонстрационным проектом. Создайте проект в Android Studio и установите минимальную поддерживаемую версию SDK как минимум на 9. Это минимальное требование для использования Служб Google Play.

После того, как Android Studio создала проект шаблона Hello World, откройте файл build.gradle и под узлом dependencies добавьте требуемую зависимость Play Services 7.0. Это самое последнее на момент написания статьи, но вы можете проверить последнюю версию, проверив документацию Google.

Затем откройте AndroidManifest.xml, добавьте необходимые разрешения для проекта и укажите, что приложение OpenGL 2 требуется для приложения.

Последнее, что вам нужно сделать в манифесте, - добавить два тега <meta-data>, чтобы установить версию gms и ключ API для приложения в теге <application>.

Когда вы закончите с манифестом, мы готовы начать писать код. Поскольку это компонент из Play Services, вам нужно будет инициализировать ваш GoogleApiClient и подключить / отключить его во время жизненного цикла вашей Activity. Мы делаем это в методах onCreate, onStart и onStop класса Activity.

2. Использование виджета Place Picker

Виджет Place Picker - это компонент пользовательского интерфейса, предоставляемый Play Services, который позволяет пользователю видеть карту их окружения. Компонент включает список ближайших мест, которые могут использоваться вашим приложением. Используя этот компонент, вы можете следить за стандартным дизайном, который ваши пользователи будут знать, как взаимодействовать, сохраняя время разработки.

Place Picker Widget

Чтобы использовать Place Picker, вам нужно создать намерение и прослушать результат Activity для извлечения места, выбранного пользователем. Следующий метод показывает, как запустить эту Activity

PlacePicker.IntentBuilder используется для создания Intent, которое будет использоваться для запуска Place Picker. Он также имеет доступный метод setLatLngBounds, который позволяет разместить географическую границу с юго-западного угла в северо-восточном углу, чтобы управлять областью поиска.

Intent может быть построен с использованием метода build из PlacePicker.IntentBuilder и запущен с использованием метода startActivityForResult из вашей Activity. Следует отметить, что использование метода build имеет возможность выбросить исключение GooglePlayServicesRepairableException или исключение GooglePlayServicesNotAvailableException, поэтому их необходимо проверить для использования стандартного блока try / catch и обработать, если они возникнут.

Если пользователь выбирает местоположение из списка выбора места, этот объект Place упаковывается в Intent и отправляется обратно в вызывающую Activity. Используя метод PlacePicker.getPlace, вы можете извлечь данные Place из возвращаемого Intent.

Когда объект Place будет извлечен, его можно рассматривать как модельный объект для отображения или использования в вашем приложении.

The Places API In Action

3. Поиск текущего места пользователя

Еще одна интересная особенность API-интерфейса Places заключается в том, что вы можете использовать его, чтобы угадать, находится ли пользователь в настоящее время в списке. API также обеспечит вероятность того, что вы сможете принимать обоснованные решения о том, как ваше приложение должно взаимодействовать с пользователем. Следует отметить, что это одна из особенностей API, которая требует запроса против ваших выделенных способов использования.

Чтобы определить место пользователя, вам необходимо использовать метод Places.PlacesDetectionApi.getCurrentPlace для создания PendingIntent, который возвращается с объектом PlaceLikelihoodBuffer. Используя ResultCallBack, вы можете взять первое и, скорее всего, место из буфера и использовать его в своем приложении.

Если вашему приложению нужна дополнительная информация, вы можете извлечь другие элементы PlaceLikelihood из буфера, пройдя через него. Вероятность того, что это место находится там, где находится пользователь, передается обратно в каждый объект PlaceLikelihood, поскольку значение с плавающей точкой от 0.0 до 1.0, 1.0 является почти гарантированным совпадением. Не забудьте вызвать release у PlaceLikelihoodBuffer, чтобы избежать утечек памяти.

Asking the Places API for the Likelihood of the Current Place

4. Прогнозирование мест

Следующая, и самая сложная тема, которую мы рассмотрим в этом учебном пособии, - это предсказание и отображение мест для пользователя при вводе поискового запроса. Опять же, этот вызов API также учитывает ограничения использования API. Однако, это бесценно для того, чтобы сделать ваше приложение более полезным.

Predicting Places

Для этой части учебника вы будете использовать AutoCompleteTextView и пользовательский адаптер в приложении, чтобы ввести имя места для прогнозов. Практически вся работа выполняется в адаптере. Однако нам нужно будет передать ссылку на GoogleApiClient на адаптер для доступа к API.

Это можно сделать в стандартном обратном вызове GoogleApiClient, onConnected, и мы можем удалить экземпляр клиента в onStop, где mAdapter является экземпляром нашего пользовательского класса Adapter, AutoCompleteAdapter.

Чтобы инициировать вызов API, когда пользователь вводит новое письмо в AutoCompleteTextView, вам необходимо переопределить метод getFilter для ArrayAdapter. Этот метод запускается каждый раз, когда пользователь изменяет содержимое представления, связанного с адаптером. Он позволяет изменять содержимое адаптера AutoCompleteTextView. В следующем примере constraints представляют собой содержимое представления.

Метод displayPredictiveResults - это фактическое взаимодействие с API. Существует несколько различных объектов, которые можно настроить для настройки ваших прогнозов.

Первый - это объект LatLngBounds, который создает квадратную границу от юго-западной точки до северо-восточной точки, чтобы локализовать запрос. Если вместо инициализированного объекта LatLngBounds передается значение null, то в запросе не будут помечены географические ограничения.

Второй объект, который вы можете создать для настройки запроса, является фильтром для запроса API. Фильтр для вызова Places AutoCompletePredictions представляет собой список объектов Integer, представляющих различные типы фильтров. На данный момент к запросу может быть применен только один тип фильтра. Допустимые значения можно найти в документации. Если список Integer пуст или передан значение null, тогда возвращаются все типы результатов.

Когда вы будете готовы выполнить запрос, вы можете использовать метод Places.GeoDataApi.getAutocompletePredictions, чтобы вернуть PendingIntent, который может быть связан с ResultCallback для отображения возвращенной информации.

Важно отметить, что пользовательский объект, представляющий объекты AutoCompletePrediction из буфера, используется для хранения данных в ArrayAdapter. В противном случае исключается исключение IllegalArgumentsException, как только будет освобожден буфер, что крайне важно для предотвращения утечки памяти.

Содержимое в AutoCompleteAdapter отображается с использованием макета android.R.layout.simple_list_item_1 и стандартного шаблона ViewHolder в getView.

Когда элемент выбирается из этого списка, идентификатор выбранного Place передается в onItemClickedListener и отображается для отображения.

5. Поиск места по идентификатору

Последняя часть этого руководства охватывает поиск объекта Place на основе его идентификатора. Это работает аналогично другим вызовам API, создавая PendingIntent и взаимодействуя с возвращенным буфером для извлечения места. Как и другие объекты буфера, с которыми вы работали, PlaceBuffer должен вызвать release, чтобы избежать утечек памяти.

Заключение

API-интерфейс Places - это мощный инструмент для информирования ваших пользователей о местоположении пользователя, чтобы предоставить им контекстуальную информацию. В этом уроке вы узнали, как использовать компонент Place Picker, угадывать место пользователя, представлять его с прогнозирующими результатами при поиске и находить место на основе данного идентификатора. Помимо затронутых здесь тем, также можно отправить новые места в Google, чтобы помочь расширить информацию, к которой имеет доступ API.

Advertisement
Advertisement
Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.