В помощь мобильному разработчику
google play services

Простое и быстрое обновление местоположения на Android при помощи сервисов Google Play

Александр Алексеев

ПриГеопозиция и локация запуске приложения Android, важной частью которого является определение местоположения устройства, можно столкнуться с некоторыми трудностями. Классический способ получения местоположения подразумевает использование основных API-интерфейсов Android.

Однако, эти интерфейсы появились сравнительно давно, поэтому с ними подчас бывает непросто разобраться. Чтобы упростить этот процесс, мы разработали плагин Geolocator, который позволяет получать местоположения при совместном использовании кода на iOS, Android и Windows из одного API-интерфейса. Однако, бывает время, когда требуется полный контроль над API-интерфейсом, и тогда новые API от сервисов Google Play, предназначенные для определения местоположения, приходятся как нельзя кстати. Эти API-интерфейсы упрощают определение местоположения пользователя при помощи различных датчиков на устройстве. Это означает, что при использовании этих новых API запрос на обновление местоположения выполняется быстрее и точнее, а с последним обновлением (11.0.4) это стало делаться и того проще.

 

Начало работы

Теперь следует убедиться в том, что наш проект ориентирован на Android 7.0 и установить последние версии библиотек поддержки Android.

Цель

Интерфейсы API, которые мы будем использовать, являются частью новой версии пакета NuGet — Google Play services Location 11.0.4 NuGet, который в настоящее время находится на стадии предварительного релиза. Просто удостоверьтесь в том, что у Вас включен показ предварительных версий NuGet, затем найдите пакет Xamarin.GooglePlayServices.Location и установите его в приложение Android:

NuGet

Кроме того, нам следует убедиться и в том, что у нас есть права на получение данных местоположения в AndroidManifest.

Требуемые права

 

Получение данных местоположения

Разработчикам ранее требовалось создать клиент Google API, указать, какие API они хотели бы использовать, подключиться к службе, и только затем осуществлять вызовы API, которые им были нужны. Это все изменилось в 11 версии Location APIs, которые могут запросить текущий FusedLocationProviderClient и затем начать выполнять вызовы. Для запуска этого клиента требуются два параметра:

  • LocationRequest: Установки для обновления местоположения
  • LocationCallback: Класс, который будет получать обратный вызов при обновлении местоположения

 

Создание обратного вызова местоположения

Внутри нашей MainActivity мы можем создать реализацию LocationCallback и событие, на которое можно подписаться, когда появится результат определения местоположения:

 

Мы также можем создать обработчик событий внутри MainActivity, и когда нам потребуется получить события, мы сможем, соответственно, подписаться на него, равно как и отписаться:

 

Запрос местоположения

Теперь когда наш обратный вызов местоположения на месте, настало время получить текущий FusedLocationClient и создать запрос:

Ну вот! С помощью этих нескольких строк кода обновления местоположения будут производиться непрерывно, пока пользователь будет держать приложение открытым.

 

Подробнее

Не стоит также забывать о некоторых других немаловажных вопросах, возникающих при использовании служб местоположения, таких как обработка ситуаций при отключении пользователем определения местоположения, при входе в фоновое состояние и, конечно, при отключении обновлений местоположения, когда это не требуется. Вы можете найти полный сэмпл, посвященный всем этим факторам, включая обработку прав на моем GitHub.

 

Автор: James Montemagno
ИсточникОфициальный блог Xamarin

Александр Алексеев
Александр Алексеев

Xamarin - разработчик. Работаю с .NET платформой с 2012 года, программирую в основном с использованием C#. За это время успел поработать с ASP.NET, Entity Framework, MSSQL, Git

xamarin forms

1 Comment

  1. Аватар Евгений Reply to Евгений

    Спасибо за перевод поста!
    Хотелось бы добавить, что данный способ является оптимальным и самым простым.
    Существует так же возможность взаимодействия с location api, используя GoogleApiClient, но данный способ я бы не рекомендовал, так как Linker при сборке Release делает его не работоспособным, а устранение неполадки занимает время.

Написать ответ