Сервисы Google Play предлагают разработчикам множество невероятных API-интерфейсов для интеграции в приложения iOS и Android. В частности, разработчикам Android доступно несколько дополнительных API-интерфейсов, дающих ещё больше возможностей и интеграции с операционной системой Android при разработке приложений для этой платформы. Один из самых новых API-интерфейсов — Awareness объединяет в себе семь различных сигналов контекста и местоположения в один простой в использовании API, среди которых время (time), область (location), места (places), маяки (beacons), наушники (headphones), активность (activity) и даже погода (weather). Пакет NuGet для API-интерфейса Awareness запускается вместе с нашим релизом сервисов Google Play 9.6.1 (32.961.0) для Xamarin.
Awareness предлагает два различных способа для проникновения в суть этих сигналов — API-интерфейсы Fence и Snapshot. Интерфейс Fence позволяет реагировать на сигналы и изменения в пользовательской среде. Можно создавать несколько условий, которые должны быть выполнены, и когда это происходит, получать обратный вызов, с тем чтобы на них реагировать. А вот Snapshot API, о котором мы сейчас поговорим, предоставляет прямой доступ к сигналам от одного обычного асинхронного API. Помимо того что он является простым интерфейсом, Awareness API обеспечивает лучшие использование аккумулятора и памяти благодаря интеллектуальному кэшированию и перекрёстной оптимизации приложений.
Установите Awareness NuGet
Для того чтобы получить доступ к Awareness API в первую очередь нужно добавить сервисы Google Play — Awareness NuGet в приложение Xamarin.Android. На момент написания этой статьи актуальной версией является 32.961.0. Проще всего можно найти NuGet непосредственно введя имя пакета Xamarin.GooglePlayServices.Awareness. Дополнительные зависимые объекты сервисов Google Play: Places, Location, Base packages и необходимые Support Packages тоже появятся при добавлении NuGet.
Регистрация ключей API
Сервисы Google Play зачастую требуют уникального ключа API для каждого использующего их приложения. А эти ключи создаются и активизируются в Google API Developer Console. Сперва нужно создать новый проект:
После того как он будет создан, следует включить три различных API:
- Awareness API
- Google Places API для Android (для Places API)
- Nearby Messages API (для Beacons API)
Вам нужно ввести название пакета приложения и SHA1 хранилища ключей, которое Вы используете для отладки и релиза проекта, когда приходит время размещать его в app store и регистрировать. Можете ознакомиться с нашим материалом по «получению ключа подписи отпечатком пальца в Android».
Просто создайте новые параметры доступа с помощью этих ключей.
Добавление ключей к Android Manifest
После того как зарегистрируйтесь, Вы получите уникальный ключ API, который следует добавить в файл Android Manifest. Этот же ключ API понадобится для каждого из тегов метаданных, которые мы добавим к узлу приложения, что будет выглядеть следующим образом:
1 2 3 4 5 | <application android:label="@string/ApplicationName" android:icon="@drawable/Icon" android:theme="@style/MyTheme"> <meta-data android:name="com.google.android.awareness.API_KEY" android:value="ENTER_API_KEY_HERE_FROM_CONSOLE" /> <meta-data android:name="com.google.android.geo.API_KEY" android:value="ENTER_API_KEY_HERE_FROM_CONSOLE" /> <meta-data android:name="com.google.android.nearby.messages.API_KEY" android:value="ENTER_API_KEY_HERE_FROM_CONSOLE" /> </application> |
Создание GoogleAPIClient
Так как регистрация всех ключей API выполнена, настало время для того, чтобы уже начать использовать Awareness API. Для работы с любым сервисом API от Google Play необходимо создать GoogleApiClient. Прежде всего, давайте привнесём несколько пространств имен:
1 2 3 4 | using Android.Gms.Common.Apis; using Android.Gms.Awareness; using Android.Gms.Awareness.State; using Android.Gms.Extensions; |
Теперь в Activity мы можем создать и подключить GoogleApiClient:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | public class MainActivity : Activity { GoogleApiClient client; protected async override void OnCreate(Bundle bundle) { base.OnCreate(bundle); client = await new GoogleApiClient.Builder(this) .AddApi(Awareness.Api) .AddConnectionCallbacks(() => { //Connected Successful }) .BuildAndConnectAsync((i) =>{ }); } } |
Сигналы запроса
Теперь мы можем начать использовать API для запроса таких сигналов, как состояние наушников.
1 2 3 4 5 6 7 8 9 10 11 12 | var headPhones = await Awareness.SnapshotApi.GetHeadphoneStateAsync(client); if (headPhones?.Status?.IsSuccess ?? false) { if(headPhones.HeadphoneState.State == HeadphoneState.PluggedIn) Debug.WriteLine(Headphones plugged in"); else Debug.WriteLine(Headphones not plugged in"); } else { Debug.WriteLine("Could not get headphone state"); } |
Прочие сигналы, за исключением наушников, например, местоположение и распознавание активности требуют дополнительных прав. Мы должны добавить два специальных разрешения в Android Manifest:
1 2 | <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="com.google.android.gms.permission.ACTIVITY_RECOGNITION" /> |
Для запроса разрешений и проверки их наличия мы можем использовать Permissions Plugin, который помогает абстрагировать функциональность в обычный вызов. Если нам необходимо запросить местоположение и погоду, то мы можем использовать Permissions Plugin вместе с Awareness API:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | //Check and request permissions var status = await CrossPermissions.Current.CheckPermissionStatusAsync(Permission.Location); if (status != PermissionStatus.Granted) { var results = await CrossPermissions.Current.RequestPermissionsAsync(Permission.Location); if (results[Permission.Location] != PermissionStatus.Granted) return; //handle rejection } //Get current location var location = await Awareness.SnapshotApi.GetLocationAsync(client); if (location?.Status?.IsSuccess ?? false) Debug.WriteLine($"Location: {location.Location.Latitude},{location.Location.Longitude}"); //Get weather information var weather = await Awareness.SnapshotApi.GetWeatherAsync(client); if (weather?.Status?.IsSuccess ?? false && weather.Weather != null) { Debug.WriteLine($"Temperature: {weather.Weather.GetTemperature(1)} "; Debug.WriteLine($"Humidity: {weather.Weather.Humidity}%"; Debug.WriteLine($"Feels Like: {weather.Weather.GetFeelsLikeTemperature(1)} "; Debug.WriteLine($"Dew Point: {weather.Weather.GetDewPoint(1)} "; } |
Мы даже можем пойти дальше и определить текущую активность пользователя, к примеру, бег или езду на велосипеде при помощи запроса Detected Activity:
1 2 3 4 5 6 | var detectedActivity= await Awareness.SnapshotApi.GetDetectedActivityAsync(client); if (detectedActivity?.Status?.IsSuccess ?? false) { var probablyActivity = detectedActivity?.ActivityRecognitionResult ?.MostProbableActivity; Debug.WriteLine(probablyActivity?.ToString() ?? "No activity"); } |
Заключение
Awareness API является чрезвычайно мощным и в то же время очень эффективным в вопросе энергопотребления при запросах сигналов на устройстве. Вы можете скачать полный пример исходного кода с моей страницы на GitHub, и из него станет яснее весь процесс использования API-интерфейса Snapshot, кроме того, Вы можете лучше разобраться в особенностях Awareness API, ознакомившись с информацией на портале для разработчиков от Google.
Автор: James Montemagno
Источник: Официальный блог Xamarin
Написать ответ