Есть мнение, что в реальной жизни смартфоны с ОС от Microsoft встречаются так же часто, как люди с отчеством «Артёмович». Странная (мягко говоря) политика «Корпорации зла» в отношении седьмого и восьмого семейств мобильной операционной системы отвратила множество пользователей от экспериментов с «окошками» для смартфонов, и сейчас корпорация всерьез взялась за исправление своего имиджа в этой пользовательской нише. Как подпольный фанат Microsoft я надеюсь, что у них все получится — «десятка» шагает по планете, ее главный козырь — одно ядро для всех платформ, и поэтому у нее есть все шансы перетянуть на себя хорошую часть мобильного рынка. А как программист я с удовольствием сделаю для тебя вводную статью по разработке под эту мобильную ось, чтобы ты всегда был готов к росту ее популярности :).

 

Обзор архитектуры

Благодаря общему ядру и системе выполнения приложений UWP однажды написанное приложение будет работать на всех девайсах под управлением Windows 10. В этот диапазон входят:

  • настольные компьютеры;
  • серверные системы — ОС Windows Server 2016;
  • ноутбуки — MS Surface Book;
  • планшеты — MS Surface Pro;
  • смартфоны — Lumia;
  • игровые приставки — Xbox One;
  • очки дополненной реальности — MS HoloLens;
  • настенные планшеты — MS Surface Hub;
  • умные часы — MS Band 2.

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

UWP поддерживает драйверы как уровня ядра, так и пользовательского уровня. Подсистема включает интерфейсы драйверов устройств (Device Driver Interface — DDI), из числа которых драйвер для UWP может использовать.

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

 

Инструменты разработчика

Для написания, отладки, развертывания и тестирования приложений под Windows 10 Mobile тебе понадобится Visual Studio 2015 (кто бы сомневался). Этим летом вышел третий апдейт. Категорически рекомендую! Основной его багфикс — это уменьшенное потребление памяти по сравнению со вторым апдейтом.

Также тебе понадобится Windows 10 Anniversary Update SDK: он включает все необходимые инструменты для разработки приложений под весь парк устройств, работающих на Windows 10. Если же используется VS 2015 с третьим обновлением, тогда в нее уже входит новейший SDK.

Одно из главных новшеств — это чернила Windows (Windows Ink). С помощью этого API можно двумя строчками кода добавить поддержку пера. Для этого существуют два объекта управления: InkCanvas и InkToolbar.

Новый Cortana API упрощает реализацию управления голосом. Компонент Cortana Actions в новом API позволяет создавать новые фразы/выражения.

Биометрическая аутентификация Windows Hello теперь стала доступна веб-разработчикам в браузере Edge.

Средство для моделирования пользовательских интерфейсов Blend for Visual Studio 2015 предоставляет расширенные возможности построения интерфейса по сравнению с VS. С его помощью на языке XAML можно создавать макеты всех поддерживаемых приложений: прикладных, веб, универсальных, мобильных и так далее. Также он содержит конструкторы для дополнительных задач, среди них создание анимации и управление поведением элементов.

 

Способы создания приложений для Windows 10 Mobile

Основной способ создания приложений для смартфонов с Windows 10 Mobile — это разработка универсальных (UWP) приложений (свиток Visual C# → Windows → Universal мастеры создания проекта).

Однако он не единственный. Как ты знаешь, в Visual Studio 2015 встроен Xamarin, с его помощью тоже можно создавать приложения для Windows 10 Mobile, одновременно для Android и iOS, меняя интерфейс и оставляя программную логику на C# (Visual C# → Cross-Platform).

Кроме языка Visual C#, равнозначно может быть выбран Visual Basic или Visual C++. VS 2015 позволяет создавать универсальные приложения с помощью JavaScript (JavaScript → Windows → Универсальные приложения). Их также можно развернуть на устройстве с Windows 10 Mobile.

 

Инструменты для работы с унаследованными проектами

За долгую историю операционной системы Windows для нее было создано колоссальное количество самых разных приложений. С выходом Windows 8 и WinRT (а позже Windows 10 и UWP) старые классические приложения остались в прошлом, поскольку только в настольных Win 8 и Win 10 поддерживаются классические Win32-, COM-, .NET-приложения. От этого в Microsoft стало грустно. Но ребята смекнули, что могут разработать конвертер, который будет преобразовывать старые приложения для новой продвинутой UWP-подсистемы. Из этого родился Desktop App Converter.

Скачать его можно отсюда. Текущее состояние продукта — предварительная версия. Уже сейчас он позволяет преобразовывать классические приложения, написанные для Win32 и .NET 4.6.1, в приложения для платформы UWP.

Преобразованное приложение сохраняет функциональность предка плюс обретает возможности UWP-приложений: удобную установку, обновление, удаление. Также оно получает другие средства современных Windows-программ: push-уведомления, живые плитки, способность выполняться в качестве фоновой задачи, широкий диапазон контрактов. Одна из самых привлекательных возможностей — это продажа унаследованных приложений в Windows Store.

Desktop App Converter представляет собой приложение с интерфейсом командной строки. На входе оно получает: путь к дистрибутиву приложения, которое планируется преобразовать, путь к файлу-результату и путь к файлу — образу системы. Последний будет использован для чистой установки конвертируемой программы.

На выходе Desktop App Converter выдает каталог со всем установленным при инсталляции стаффом и два файла: манифест и файл регистрации приложения. После этого с помощью другой тулзы командной строки из образованного контента создается установочный файл UWP-приложения AppX. Затем это приложение можно установить в операционку и пользоваться им, как любым другим универсальным приложением, в том числе на Windows 10 Mobile.

После этого парни из Microsoft подумали: для iOS есть множество крутых мобильных приложений, было бы неплохо дать разработчикам возможность запилить их под нашу мобильную ось. Так появился проект с открытым исходным кодом Windows Bridge for iOS.

Преобразование Xcode-проекта выполняется в два шага. Сначала надо добавить подсветку синтаксиса языка Objective-C в Visual Studio: установить расширение objc-syntax-highlighting.vsix из папки winobjc\bin. Затем с помощью утилиты командной строки vsimporter.exe надо преобразовать проект на Xcode в проект на VS. После этого полученный sln-файл можно открыть в студии, где синтаксис Objective-C будет подсвечен. Можешь построить и запустить приложение, оно будет выполняться так же, как все другие Windows-программы.

VS с подсветкой синтаксиса Objective-C
VS с подсветкой синтаксиса Objective-C

Разрази меня гром, как это удивительно — видеть в Visual Studio корректно подсвеченный код Objective-C!

Для компиляции кода Obj-C используется свободный компилятор Clang. Поскольку на выходе получается стандартное UWP-приложение, его можно запустить на мобильном устройстве в среде Windows 10 Mobile. В одной программе может быть код на C++ и на Obj-C.

Вывод OpenGL на эмуляторе смартфона Windows 10 Mobile
Вывод OpenGL на эмуляторе смартфона Windows 10 Mobile

Если у тебя есть проект для прошлой версии Windows Phone, то есть 8.1 (или 8.0), то, когда ты его откроешь в VS 2015, студия автоматически обновит проект, чтобы он соответствовал требованиям универсального приложения Windows (UWP). Будет преобразована не только разметка пользовательского интерфейса на XAML, но и вместе с ней программная логика на JS/C++/C#/VB. Если в коде были вызовы подсистемы WinRT, тогда они будут преобразованы в вызовы UWP.

Есть еще распространенный тип приложений — игры. iOS и Android визуализируют посредством низкоуровневого интерфейса OpenGL. С другой стороны, на Windows 10 Mobile для вывода изображения в играх используется DirectX 11. Получается несовместимость. Но есть решение — открытый проект ANGLE. ANGLE (Almost Native Graphics Layer Engine) — движок почти нативного графического слоя — позволяет пользователям Windows бесшовно запускать OpenGL ES приложения на аппаратуре, работающей с DirectX 11. Это достигается путем преобразования вызовов с OpenGL ES API на DirectX 11 API. ANGLE полностью поддерживает следующие три типа приложений:

  • универсальные приложения для Windows 10 (Universal Windows apps);
  • приложения для Windows 8.1 и Windows Phone 8.1;
  • классические приложения для рабочего стола Windows (Windows desktop applications).

Более подробно вопрос рассматривается в моей книге «Волшебство момента вращения» (опять ты книгу свою пиаришь! Ну лаадно, заслужил. — Прим. ред.).

 

Подключение смартфона

По умолчанию устройство подключается в режиме «Только зарядка», поэтому в параметрах надо переключить на режим передачи данных. Также этот вопрос появится в момент подключения девайса к ПК. В отличие от седьмой версии мобильной системы сейчас для передачи данных не нужна посредническая программа Zune, смартфон появляется в системе как дополнительное устройство, и навигация вместе с передачей данных доступна с помощью проводника. Кроме того, в параметрах смартфона в меню «Обновление и безопасность» в подменю «Для разработчика» надо установить «Режим разработчика», который позволяет запускать на смартфоне любые приложения, а не только из Windows Store.

Режим разработчика
Режим разработчика

В Windows 10 есть утилита «Диспетчер телефонов». С ее помощью можно посмотреть состояние устройства: степень зарядки аккумулятора, сколько места занимают определенные коллекции данных (фото, видео), импортировать фото/видео и так далее.

Диспетчер телефонов
Диспетчер телефонов

Если сейчас из студии попытаться запустить приложение, то тебя ждет неминуемая трабла. Дело в том, что требуется сервис IpOverUsbSrc. От имени администратора открой консоль и введи туда команду net start IpOverUsbSvc.

Консоль с выполненной командой
Консоль с выполненной командой

Сервис запустится, и ты получишь возможность развертывать приложения на своем смартфоне прямо из студии по USB.

 

Реальный пример

Теперь, когда у нас есть реальный девайс, можно поиграть с разными датчиками, с которыми было или невозможно, или затруднительно работать на симуляторе. Однако замечу, что для WP и/или WM создан крутой симулятор, надо только оперативы побольше, чтобы он шустро бегал. Между тем с реальным устройством и реальными данными иметь дело удобнее и лучше.

По сравнению с другими гаджетами смартфоны от Microsoft для меня интересны благодаря двум компонентам: это большой набор датчиков вместе с соответствующими API и либа Imaging SDK, с помощью которой можно быстро делать впечатляющие эффекты к изображениям и видео. При обработке изображений используются возможности GPU, поэтому процессинг видеопотока происходит на лету. Как первый, так и второй компонент унаследованы от Nokia.

 

Датчики

API для работы с датчиками раньше носил имя SensorCore, но с выходом Windows 10 был помечен как устаревший и теперь, после обновления, входит в пространство имен Windows.Devices.Sensors платформы UWP. Датчики используются для отслеживания физической активности и перемещений пользователя смартфона.

Всего в Windows 10 Mobile поддерживается 12 сенсоров:

  • акселерометр;
  • датчик действий;
  • высотомер;
  • барометр;
  • компас;
  • гигрометр;
  • инклинометр;
  • датчик света;
  • датчик положения в пространстве;
  • шагомер;
  • бесконтактный датчик;
  • датчик простого положения в пространстве.

Между прочим, не каждая модель смартфонов обладает всеми этими сенсорами, например у меня в телефоне отсутствует компас.

Описание работы с каждым датчиком можно выделить в отдельный разговор, поэтому сегодня мы рассмотрим только один сенсор — датчик действия. Во включенном состоянии он способен определить действия, которые выполняет пользователь. В частности, этот датчик используется в фитнес-приложениях, он позволяет контролировать, чем занимается юзер: стоит, идет или едет на автобусе вместо того, чтобы пробежать это расстояние. Yurembo на себе протестировал гаджет: действия определяются без сбоев.

Сенсор активности так же, как и другие датчики, работает в фоновом потоке и сохраняет данные за прошедшие десять дней активности или бездействия :). Его можно отключить в выпадающем сверху экрана меню (вызывается проведением пальца сверху вниз), деактивировав значок «Местонахождение».

Выключение датчика действия
Выключение датчика действия

Чтобы проверить работу датчика, создай новое UWP-приложение, в качестве заготовки выбери Blank App. Она одна имеется в числе визуальных приложений, другие можешь скачать, прямо не выходя из мастера создания проекта: «В сети → Шаблоны → Visual C#».

Придай форме альбомный вид и помести на нее шесть компонентов TextBox и кнопку (см. рис. ниже).

Макет
Макет

Имена первых трех текстовых меток не имеют значения, а те, куда будут выводиться данные, назовем (сверху вниз): valueActivity, valueConf, valueTimeStamp. Создай обработчик нажатия кнопки и перейди в C#-код. Добавим два пространства имен:

using Windows.Devices.Enumeration;
using Windows.Devices.Sensors;

В первом содержатся классы для перечисления устройств. В нашем случае оно нужно, чтобы обнаруживать датчик и сообщать программе о его состоянии. Как я говорил, не во всех моделях присутствуют все сенсоры.

Во втором пространстве имен находятся классы всех поддерживаемых датчиков.

Далее нам надо создать объект GUID устройства. В класс MainPage добавь такую строчку:

Guid ActivitySensorClassId = new Guid("9D9E0118-1807-4F2E-96E4-2CE57142E196");

Параметр конструктора класса Guid является строкой с заданным значением Guid и представляет собой идентификатор класса устройства, то есть каждый класс устройства имеет строго заданный Guid, по которому система определяет тип девайса.

В обработчике события нажатия кнопки первым делом нам надо получить информацию о датчике активности, выяснить, присутствует ли он в данном смартфоне:

var deviceAccessInfo = DeviceAccessInformation.CreateFromDeviceClassId(ActivitySensorClassId);

Так мы инициализируем объект класса DeviceAccessInformation на основе идентификатора класса устройства, как мы обсуждали выше, и сохраняем в переменную deviceAccessInfo.

Далее проверяем статус доступа к устройству:

if (deviceAccessInfo.CurrentStatus == DeviceAccessStatus.Allowed) {

При наилучшем раскладе статус имеет значение Allowed (на что мы, собственно, надеемся, поскольку иначе дальнейшее выполнение бессмысленно), то есть доступ разрешен. Статус устройства может иметь еще три значения:

  • Unspecified — доступ не определен;
  • DeniedByUser — запрещено пользователем;
  • DeniedBySystem — запрещено системой.

В случае успеха мы создаем объект класса ActivitySensor, который представляет датчик активности. Делаем это через асинхронный вызов метода GetDefaultAsync класса:

var activitySensor = await ActivitySensor.GetDefaultAsync();

Проверяем значение переменной activitySensor на равенство null и в случае отрицательного результата получаем текущие показания счетчика, сохраняя их в переменную класса ActivitySensorReading, которую впоследствии можно распарсить:

ActivitySensorReading reading = await activitySensor.GetCurrentReadingAsync();

Проверяем эту переменную, чтобы она не была равна null, извлекаем из нее значения и помещаем их в соответствующие текстовые поля:

if (reading != null) {
    valueActivity.Text = reading.Activity.ToString();
    valueConf.Text = reading.Confidence.ToString();
    valueTimeStamp.Text = reading.Timestamp.ToString("u");
}

Датчик способен определить семь активностей плюс одно неопределенное:

  • Idle — девайс находится в состоянии бездействия, лежит на столе;
  • Stationary — в неподвижном состоянии;
  • Fidgeting — девайс фиксирует слабое движение;
  • Walking — во время пешей ходьбы, то есть одна нога всегда соприкасается с поверхностью;
  • Running — состояние бега, то есть состояние полета, когда обе ноги во время шага находятся в воздухе;
  • InVehicle — поездка на наземном транспорте (автомобиле, автобусе, трамвае...);
  • Biking — езда на велосипеде.

Существует две степени доверенности (Confidence): Low — низкая и High — высокая.

Timestamp — временная отметка, когда были получены данные. Значение надо привести к строковому виду. В данном случае метод ToString принимает параметр ?u?, то есть преобразует объект DateTimeOffset в формат yyyy-MM-dd HH:mm:ssZ.

Для получения истории используется метод GetSystemHistoryAsync класса ActivitySensor. В качестве параметра метод получает временную метку, момент, за который надо получить историю, или два параметра: метку плюс продолжительность, тогда возвращаются данные за указанный период.

Объект класса ActivitySensor имеет событие ReadingChanged, которое возникает всякий раз, когда датчик посылает данные об изменении действий, выполняемых юзером.

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

 

Запуск

Если сейчас запустить приложение, то внезапно окажется, что оно не работает. Отладка показывает, что во время первой проверки состояние доступа к девайсу не определено (Unspecified). Чтобы сообщить Windows 10 Mobile, что твое приложение хочет получить доступ к датчику активности, тебе надо написать об этом в манифесте. Открой файл Package.appxmanifest в XML-редакторе, пролистай содержимое до области, ограниченной тегами <Capabilities>, и добавь туда строчку

<DeviceCapability Name="activity"/>

После этого можешь развертывать приложение, все будет работать, как надо.

Скриншот работающего на смарте приложения
Скриншот работающего на смарте приложения
 

Итоги

Сегодня мы много говорили о технологиях Microsoft как в аппаратном, так и в софтверном плане. Обсудили используемые для разработки софта инструменты. Затем мы рассмотрели способы создания приложений под Windows 10 Mobile. В частности, мы обратили пристальное внимание на импортирование унаследованных проектов, другими словами — возможность создания приложений для Windows 10 на основе программ из других операционных систем. Портирование классических Windows-приложений под платформу UWP вроде как вещь сама собой разумеющаяся. Но вот создание UWP-программ на основе iOS-приложений с Obj-C-кодом — это впечатляет. А главное, что эти инструменты свободные и открытые!

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

Многие сенсоры унаследованы еще от смартфонов с операционной системой Windows Phone 7.5, и работу с ними мы рассматривали еще в те давние времена, поднимай подшивку «Хакера». Другие датчики весьма новые, и нам будет интересно разобраться с их использованием и получением от них профита. Но это планы на будущее.

А сегодня мне остается пожелать тебе веселой не пасмурной осени и удачи во всех делах!

 

Microsoft loves Open Source

Сайт github.com каждый год подводит итог: какая компания самая активная в плане открытых исходников, другими словами — кто сделал больше всех вкладов в открытые проекты. По итогам прошедшего года такой компанией стала Microsoft. Достаточно взглянуть на страницу корпорации на сайте GitHub.

Юрий Язев

Юрий Язев

Широко известен под псевдонимом yurembo. Программист, разработчик видеоигр, независимый исследователь. Старый автор журнала «Хакер».

Check Also

Погружение в ассемблер. Зачем учить ассемблер в 2020 году

Ты решил освоить ассемблер, но перед этим хочешь понять, что тебе это даст как программист…

1 комментарий

  1. Аватар

    le

    06.11.2016 в 12:10

    Ребята, «confidence» означает «степень доверия», а вовсе не «конфиденциальность» 🙂

Оставить мнение