Pull to refresh
0
Microsoft
Microsoft — мировой лидер в области ПО и ИТ-услуг

Lumia SensorCore SDK: новые возможности для разработки мобильных приложений. Часть 2: Создание приложения

Reading time9 min
Views6.8K


Доброго дня, всем!

В предыдущей статье мы провели обзор Lumia SensorCore SDK и его компонентов, которые позволяют создавать приложения, отслеживающие активность пользователя в режиме минимального энергопотребления.

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

В качестве примера использования SensorCore SDK, возьмем идею приложения, которое отправляет уведомление в зависимости от местонахождения устройства. Для этой цели отлично подходит инструмент Place Monitor API.

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



В другой ситуации, когда сбор необходимой информации отключен пользователем, следует предусмотреть быстрый доступ к подключению настроек (рис. 1-2), а так же сценарий, при котором пользователь отказывается от их подключения (рис. 3) – например, корректное прекращение работы приложения:



Далее рассмотрим пример создания приложения с применением лучших практик разработки с использованием SensorCore SDK.

Создаем приложение


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

Ниже рассмотрим примеры инициализации, обработки ошибок и управления жизненным циклом приложения:

  1. Создаем Blank App (Windows Phone) проект на C#, используя Visual Studio 2013 (Update 3).
  2. Подключаем SensorCore SDK в проект: Tools->NuGet Package Manager-> Manage NuGet Packages



    Нажимаем Install для всех компонентов.

    Таким образом в проект добавились ссылки на библиотеки Lumia.Sense, Lumia.Sense.Testing и Microsoft Visual C++ 2013 Runtime Package for Windows Phone.
  3. Для доступа к API необходимо в манифесте приложения объявить SensorCore HID устройство и возможность доступа к нему.

    Установка SDK добавляет эти возможности в Package.appxmanifest автоматически:

    <DeviceCapability Name="location" />
        <m2:DeviceCapability Name="humaninterfacedevice">
          <m2:Device Id="vidpid:0421 0716">
            <m2:Function Type="usage:ffaa 0001" />
            <m2:Function Type="usage:ffee 0001" />
            <m2:Function Type="usage:ffee 0002" />
            <m2:Function Type="usage:ffee 0003" />
            <m2:Function Type="usage:ffee 0004" />
          </m2:Device>
        </m2:DeviceCapability>
    

  4. Для того чтобы SDK работал корректно необходимо переключить платформу на x86 в Менеджере конфигурации: Build ->Configuration manager



    Стоит отметить, что при тестировании приложения на устройстве Active solution platform следует поставить в значение ARM.
  5. Для использования инструментов SensoreCore SDK подключим следующие библиотеки:

    using Windows.UI.Popups;
    using System.Threading.Tasks;
    using Lumia.Sense;
    using Lumia.Sense.Testing;
    


Инициализация SensoreCore


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

Заменить фактические API SensorCore на симулятор легко, достаточно добавить к идентификатору класса «Simulator»:

private PlaceMonitor _placeMonitor;=> private PlaceMonitorSimulator _placeMonitor;

Но чтобы легче было переключаться между фактическим классом и классом симулятора, удобнее всего использовать псевдоним для класса, и в проекте обращаться к нему с ключевым словом Monitor.
Например:

//using Monitor = Lumia.Sense.PlaceMonitor;
using Monitor = Lumia.Sense.Testing.PlaceMonitorSimulator;

Инициализация поддержки необходимого оборудования


Так как работа Lumia SensorCore SDK основана на аппаратных возможностях телефона, которыми обладают не все устройства, первое, что необходимо учесть при разработке, это проверку на то, поддерживает ли устройство необходимое для SensorCore оборудование.

Если же для приложения существует сценарий, в котором использование SensorCore SDK не является необходимым, то было бы неплохо в соответствии с этим настроить видимость UI элементов управления.

if (await Monitor.IsSupportedAsync())

Обратим внимание, что пока используется класс PlaceMonitorSimulator, свойство не поддерживается, и на этом этапе соответствующий код необходимо закомментировать, однако при использовании в приложении реального API, его следует активировать вновь:

//if (await Monitor.IsSupportedAsync())
                {
                    // Init SensorCore
                    if (await CallSensorcoreApiAsync(async () => { monitor = await Monitor.GetDefaultAsync(); }))
                    {
                        Debug.WriteLine("PlaceMonitor initialized.");
                        // Update list of known places
                        UpdateKnownPlacesAsync();

                        HomeButton.IsEnabled = true;
                        WorkButton.IsEnabled = true;
                        FrequentButton.IsEnabled = true;
                        CurrentButton.IsEnabled = true;
                    }
                    else
                    {
                        Application.Current.Exit();
                    }

                    // Focus on home
                    OnHomeClicked(null, null);
                }
/*                else
                {
                    MessageDialog dialog;
                    dialog = new MessageDialog("Your device doesn't support Motion Data. Some functionality will be disabled", "Information");
                    dialog.Commands.Add(new UICommand("Ok"));
                    await dialog.ShowAsync();

                    HomeButton.IsEnabled = false;
                    WorkButton.IsEnabled = false;
                    FrequentButton.IsEnabled = false;
                }*/


Безопасный вызов Lumia SensorCore SDK


При вызыве API, важно проверить, что требуемые настройки (Location data/ Motion data) включены и не возникнет исключение.
Для этого используем обертку, которую необходимо определить при вызове SensorCore SDK и которая позаботиться о подобных ситуациях:

private async Task<bool> CallSensorcoreApiAsync(Func<Task> action)
        {
            Exception failure = null;
            try
            {
                await action();
            }
            catch (Exception e)
            {
                failure = e;
            }

            if (failure != null)
            {
                switch (SenseHelper.GetSenseError(failure.HResult))
                {
                    case SenseError.LocationDisabled:
                        MessageDialog dialog = new MessageDialog("Location has been disabled. Do you want to open Location settings now?", "Information");
                        dialog.Commands.Add(new UICommand("Yes", async cmd => await SenseHelper.LaunchLocationSettingsAsync()));
                        dialog.Commands.Add(new UICommand("No"));
                        await dialog.ShowAsync();
                        new System.Threading.ManualResetEvent(false).WaitOne(500);
                        return false;

                    case SenseError.SenseDisabled:
                        dialog = new MessageDialog("Motion data has been disabled. Do you want to open Motion data settings now?", "Information");
                        dialog.Commands.Add(new UICommand("Yes", async cmd => await SenseHelper.LaunchSenseSettingsAsync()));
                        dialog.Commands.Add(new UICommand("No"));
                        await dialog.ShowAsync();
                        new System.Threading.ManualResetEvent(false).WaitOne(500);
                        return false;

                    default:
                        dialog = new MessageDialog("Failure: " + SenseHelper.GetSenseError(failure.HResult), "");
                        await dialog.ShowAsync();
                        return false;
                }
            }

            return true;
        }

Теперь обертка monitor.CallSensorcoreApiAsync для обращения к SensorCore SDK готова, так что вызов SDK становится безопасным.

Прежде чем использовать любой API SensorCore SDK необходимо инициализировать его вызовом GetDefaultAsync. Инициализацию можно выполнить, используя описанную выше оболочку:

if (await CallSensorcoreApiAsync(async () => { monitor = await Monitor.GetDefaultAsync(); }))

Если вызов SensorCore APIs окажется не удачным, работа приложения прекратится на этом этапе.

Активация и деактивация датчиков


В Windows XAML приложениях модель управления отличается от Silverlight приложений, поэтому подключение и отключение датчиков обрабатываться по-разному.

Добавим обработчик события VisibilityChanged, где мы будем активировать и деактивировать PlaceMonitor когда приложение будет отправляться в фон или когда оно снова будет в фокусе.

Windows XAML:

Window.Current.VisibilityChanged += async (oo, ee) =>
            {
                if (monitor != null) {
                    if (!ee.Visible)
                    {
                        await CallSensorcoreApiAsync(async () => { await monitor.DeactivateAsync(); });
                    }
                    else
                    {
                        await CallSensorcoreApiAsync(async () => { await monitor.ActivateAsync(); });
                    } }
            };

Для приложений на Silverlight сделаем следующее:

protected async override void OnNavigatedTo(NavigationEventArgs e) 
{
    if (monitor == null)
    {
        await Initialize();
    }
    await monitor.ActivateAsync(); 
}

protected override async void OnNavigatingFrom(NavigatingCancelEventArgs e) {
    await monitor.DeactivateAsync(); 
} 


Обработка ошибок


Все ошибки Lumia SensorCore SDK вызывают исключения, подробную информацию о которых можно получить, используя функцию SenseHelper.GetSenseError ().

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

Данные для тестирования


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

Для моделирования своих собственных данных с датчика можно использовать класс SenseRecorder:

PlaceMonitor monitor = await PlaceMonitor.GetDefaultAsync();
SenseRecorder recorder = new SenseRecorder(monitor);
await recorder.StartAsync();
// ... запись данных ...
await recorder.StopAsync();
await recorder.GetRecording().SaveAsync(); 

SenseRecording.SaveAsync () запускает просмотр документа для отображения записанных данных и предлагает сохранить его в папке Documents на телефоне. Получить сохраненный файл из этой папки можно путем присоединения телефона к компьютеру, используя проводник.

Дальше связываем запись с проектом, загружая ее с помощью функции SenseRecording.LoadFromFileAsync (), а затем функцией GetDefaultAsync() передаем данные в симулятор:

SenseRecording recording = await SenseRecording.LoadFromFileAsync("myData.txt");
PlaceMonitorSimulator simulator = await PlaceMonitorSimulator.GetDefaultAsync(recording); 

По умолчанию запись настраивается таким образом, что первый триггер событий регистрируется сразу же после запуска. Если необходимо определить данные записи как зафиксированные ранее или позднее, то для функции GetDefaultAsync() можно выставить собственное время начала работы симулятора:

PlaceMonitorSimulator simulator = await PlaceMonitorSimulator.GetDefaultAsync(recording, DateTime.Now - TimeSpan.FromDays(2)); 

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

Стоит отметить, что при переходе приложения в фон, запись тестовых данных останавливается и может продолжиться только при активации, так как класс SenseRecording не работает в фоновом режиме.

Фоновая задача


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

Для создания такой задачи существует стандартный алгоритм:
  • Создание фоновой задачи;
  • Объявление ее в манифесте приложения;
  • Регистрация фоновой задачи в приложении.

Перейдем к его выполнению:

Добавляем в решение новый проект Windows Runtime Component:



Переименовываем автоматически сгенерированный Class1.cs в GeofenceBackgroundTask и наследуем интерфейс IBackgroundTask.

Не забудем подключить соответствующее пространство имен: using Windows.ApplicationModel.Background

Добавим в этот класс необходимый для любой фоновой задачи метод Run:

public void Run(IBackgroundTaskInstance taskInstance)
        {
      // отправление уведомления
 var toastTemplate = ToastTemplateType.ToastText02;
            var toastXML = ToastNotificationManager.GetTemplateContent(toastTemplate);
            var textElements = toastXML.GetElementsByTagName("text");
            textElements[0].AppendChild(toastXML.CreateTextNode("Welcome again!"));

            var toast = new ToastNotification(toastXML);

            ToastNotificationManager.CreateToastNotifier().Show(toast);
        }

Добавим ссылку на проект фоновой задачи: правой кнопкой мыши -> References-> Add Reference



Выбираем и нажимаем OK.

Объявляем фоновую задачу в Package.appxmanifest:

На вкладке Declarations->Available declarations: Background Task-> Add



Отмечаем Properties: Location, поле Entry point заполняем названием класса с указанием пространства имен: BackgroundTask.GeofenceBackgroundTask.

Добавляем следующий метод для регистрации фоновой задачи:

public static async Task RegisterBackgroundTask()
        {
            try
            {
                var backgroundAccessStatus = await BackgroundExecutionManager.RequestAccessAsync();
                var geofenceTaskBuilder = new BackgroundTaskBuilder()
                {
                    Name = "GeofenceBackgroundTask",
                    TaskEntryPoint = "BackgroundTask.GeofenceBackgroundTask"
                };
                var trigger = new LocationTrigger(LocationTriggerType.Geofence);
                geofenceTaskBuilder.SetTrigger(trigger);
                geofenceTaskBuilder.Register();
            }
            catch (Exception e)
            {
                Debug.WriteLine(e);
            }
          
        }

Регистрируем задачу, для этого вызываем предыдущий метод в приложении:

await RegisterBackgroundTask();

В результате получаем уведомление от приложения в фоне при входе в гео-зону часто посещаемого места:



Заключение


В дополнение к уже существующим возможностям в Windows Phone 8.1, с Lumia SensorCore SDK разработчики получают расширенный функционал для создания приложений, в которых у пользователей появиться возможность получать и анализировать информацию о своей жизнедеятельности, при этом потребляя минимальное количество энергоресурсов телефона.

Разработчики могут применить опыт использования новых API из уже существующих примеров реальных приложений, которые к тому же доступны для скачивания в Windows Phone Store. А так же используя подробную документация для нового SDK.

Полезные ссылки


Lumia SensorCore SDK:


Обучающие курсы виртуальной академии Microsoft (MVA)
Центр разработки Windows
Загрузить бесплатную или пробную Visual Studio 2013
Lumia SensorCore SDK: Часть 1. Обзор
Tags:
Hubs:
+15
Comments0

Articles

Information

Website
www.microsoft.com
Registered
Founded
Employees
Unknown
Location
США