Дни разработчика (весна)
Приглашаем Вас на весеннюю серию событий для разработчиков. Основной темой тут выступает новая операционная система Windows 8, предлагающая разработчикам новые возможности по созданию приложений и распространению их среди пользователей.
Расписание
09:30 – 10:00 Регистрация
10:00 – 11:00 Windows 8 для разработчиков
Речь пойдет об архитектуре Windows Runtime, технологиях для разработчиков и перспективах разработки Windows 8 приложений
11:00 – 12:00 Что такое Metro-интерфейс
При разработке приложений для Windows 8 следует учитывать множество факторов и требований, соответствие которым позволит создать настоящее метро приложение. Об этом и пойдет речь в докладе.
12:00 – 12:30 Перерыв, кофе
12:30 – 13:30 Сенсоры, устройства, поддержка touch.
Речь пойдет о возможности использования большого спектра сенсоров в приложения, а также о создании интерфейсов, которые одинаково хорошо работают с мышью, пером или пальцами пользователя.
13:30 – 14:30 Новые элементы управления
Речь пойдет о возможностях использования новых элементов управления, а также об их стилизации и темах.
14:30 – 15:30 Перерыв, Обед
15:30 – 16:30 Интеграция с платформой
Речь пойдет о возможностях хранения данных в Windows 8 приложениях, интеграции с платформой (Settings, Share и др.), а также о Tiles
Windows 8 для C# разработчиков
Как и обещал, книгу опубликовали в online. Все желающие могут скачать тут:
Windows 8 для C# разработчиков
Сегодня я отправил в издательство последнюю главу новой книги «Windows 8 для C# разработчиков». Ура!
Книга была написана совместно с Сергеем Лутаем и планируется для раздачи всем, кто примет участие во втором раунде номинации Metro Style Apps Challenge международного конкурса Imagine Cup 2012. Кстати, последний шанс – 6 марта!
Хочу сразу отметить, что книга не является официальным руководством, может содержать ошибки и не отражает официальную позицию Microsoft. Тем не менее, мы планируем продолжать работать над материалом и к релизу выпустить второе издание, где учтем все ошибки и существенно (в два раза) расширим объем материала.
Данная же версия построена на основе Windows 8 Consumer Preview и имеет следующую структуру:
Глава 1. Общие концепции и средства разработки
Глава 2. Построение базовых интерфейсов
Глава 3. Стили и ресурсы
Глава 4. Графика, трансформация и анимация
Глава 5. Работа с данными
Глава 6. Интеграция Metro приложений с платформой
Глава 7. Работа с сетью
Глава 8. Создание собственных элементов управления
Глава 9. Работа с аудио и видео
Глава 10. Хранение данных и жизненный цикл приложения
Глава 11. Подготовка приложения к публикации
Глава 12. Отладка, тестирование и повышение производительности
Выпить по этому поводу не получиться, так как ночью еду в командировку. Эх!
Imagine Cup 2012: Как принять участие в Windows 8 номинации
Получаю слишком много вопросов по регистрации на сайте http://imaginecup.com, особенно в Metro-style app номинации.
Поскольку сегодня первый из 6-ти квизов, позволяющих выйти Вашей команде во второй раунд, решил пройти весь процесс самостоятельно и написать об этом статью.
Итак, первое, что необходимо сделать, это пойти на сайт конкурса http://imaginecup.com и нажать кнопку регистрации:
Тут все достаточно просто. Вам нужно выбрать имя пользователя, ввести email, язык и другую информацию. Вопрос, который возникает у студентов, что вводить в поле Attending School. Вводить нужно YES! Под школой понимаются и университетыJ No нужно выбирать только для менторов. Если Вам кто-то рассказал про конкурс, то можете ввести его имя и фамилию в поле Referral Code, но это актуально только в том случае, если рекомендацию Вам дал студент-партнер:
Завершаем заполнять формочку, соглашаясь с условиями и нажимаем кнопку Register:
Если Вы уже принимали участие в Imagine Cup (в предыдущие годы), то получите сообщение, похожее на это:
Это означает, что Ваш аккаунт уже существует. Поэтому нужно пойти в свой почтовый ящик, и посмотреть письмо, которое приходит сразу же после попытки зарегистрироваться. В письме есть специальная ссылка, которая позволяет задать Вам новый пароль для своего старого аккаунта.
Если Вы регистрируетесь впервые, то тут же попадаете на страницу со своим профилем.
Тут нужно заполнить все обязательные поля, включая номинации, в которых Вы хотите участвовать. Отметив все галочки и введя персональную информацию, нажимаем Update Profile:
Переходим к странице номинации непосредственно:
Если, по каким-то причинам, Вы не выбрали нужную номинацию, то на правой панели сможете нажать кнопку Sign Up, которая снова переведет Вас на Профиль:
В случае успешной регистрации, Вы можете приступать к участию в конкурсе.
Обращаю Ваше внимание на то, что конкурс командный. В команде может быть от одного до 4-х человек. Также может присутствовать ментор (наставник), которого обцычно выбирают из числа преподавателей ВУЗа. Поэтому нажимаем на панели справа (на странице номинации) кнопку Create a Team:
На странице, позволяющей создать команду, Вы вводите название команды, а также высылаете приглашение потенциальным участникам Вашей команды. Команду создает один из участников, а остальные лишь принимают приглашение.
Наставник (ментор) не может создавать команду. Его задача зарегистрироваться и принять приглашение.
Для поиска участников, Вы можете воспользоваться кнопкой поиска, расположенной рядом с полем ввода. Обращаю внимание на то, что поиск будет происходить лишь среди участников, которые отметили соответствующую номинацию в своем профиле:
Создав команду, Вы можете перейти на страницу номинации и нажать кнопку Compete для прохождения первого опросника:
Данная кнопка активна только во время одного из 6-ти опросников, которые проходят 31 января, 7 февраля, 14 февраля, 21 февраля, 28 февраля и 8 марта.
Обращаю Ваше внимание, что на вопросы можно отвечать как всей команде вместе, так и каждому участнику отдельно. Если используется второй вариант, то выбирается максимальный балл, как балл команды.
Чтобы пройти во второй раунд, нужно ответить на 15 и более вопросов из 30. На ответы дается час времени.
Windows 8 уже на Imagine Cup
Сегодня были анонсированы две новые номинации в рамках международного IT конкурса для студентов Imagine Cup 2012, это Kinect Fun Labs и Windows Metro Style App.
Особый интерес представляет вторая номинация, которая связана с Windows 8 и легко может быть освоена украинскими студентами. Номинация состоит из двух раундов и позволяет принимать участие как одному студенту, так и команде, вплоть до 4-х человек. При этом в команду может быть приглашен и ментор.
Номинация состоит из двух раундов.
В раунде 1 студенты (команда) должны пройти опрос, состоящий из 30 вопросов, который позволяет протестировать базовые знания команды в области создания Metro приложений. При этом, опрос может проходить как вся команда вместе, так и каждый член команды отдельно. Во втором случае, балл команды вычисляется как максимальный бал среди всех участников команды. Обращаю Ваше внимание на то, что даты опросов фиксированные и команда может попробовать улучшить свой результат в любом из раундов (если в предыдущем не добрала баллов). Даты опросов: 31 января, 7 февраля, 14 февраля, 21 февраля, 28 февраля и 8 марта. Рекомендую попробовать свои силы в одном из ближайших опросов.
Все, кто прошел в раунд 2, начинают работать над собственным приложением для Windows 8 в стиле Metro. Чтобы успешно пройти раунд 2, необходимо на сайт конкурса загрузить описание Вашего приложения и видеоролик работающего приложения.
Победители (три команды) будут приглашены в Сидней для демонстрации своих приложений и получат денежные призы.
Обращаю Ваше внимание на то, что команды финалисты будут приглашены в Сидней вместе с их ментором (естественно, за деньги Microsoft).
Бесплатная публикация приложений под Windows Phone для студентов
Компания SoftKey, являющаяся официальным паблишером приложений под Windows Phone для украинских разработчиков, поделилась замечательной новостью: все студенты, желающие опубликовать свои приложения в Windows Phone Marketplace, смогут сделать это совершенно бесплатно. При этом речь идет как о платных (такая возможность уже была), так и о бесплатных приложениях. Для осуществления публикации необходимо зарегистрироваться на сайте http://winphone.softkey.ru/ и выслать копию студенческого. Обращаю Ваше внимание на то, что заполнять контракты на десятки листов и отправлять их в Москву почтой, больше не нужно!
Благодаря упрощенной процедуре (лишь регистрация и копия студенческого), Ваше приложение может быть отправлено на сертификацию в течении 1-2 дней после регистрации на сайте SoftKey.
Данное предложение действует лишь для украинских разработчиков и на сайте еще не отражено, но публиковать можно уже сегодня. Просто следуйте моим инструкциям. Хотя официальное подтверждение уже есть тут: http://www.softkey.ua/news_detail.php?ID=12964.
Напоминаю, что если Вы хотите разблокировать телефон для разработки, то можно воспользоваться следующей процедурой.
Контакты и календарь в Windows Phone 7.5
Продолжаю рассказывать про возможности интеграции приложений с Windows Phone 7.5. На этот раз поговорим о календаре и контактах, а именно, о чтении информации из списка контактов и календаря. Если Вы решили сохранить контакт, то тут можно использовать класс SaveContactTask, который позволит инициировать вызов стандартного приложения.
Итак, как я писал ранее, чтобы получить доступ к данным пользователя, необходимо явно запросить это разрешение либо в начале приложения, либо перед самим доступом к данным. При этом должен быть механизм, позволяющий пользователю запретить доступ. В дополнении к этому, манифест приложения должен декларировать следующие возможности: ID_CAP_CONTACTS – для контактов, ID_CAP_APPOINTMENTS – для календаря.
Прописав все возможности и получив доступ со стороны пользователя можно перейти к работе с контактами и календарем. Все необходимые классы содержаться в пространстве имен Microsoft.Phone.UserData. По большому счету тут два основных класса, это Contacts и Appointments. Именно с них начинается работа. Так, необходимо создать объекты необходимых классов, определить обработчики события SearchCompleted и запустить процедуру выбора контактов с помощью метода SearchAsync. С помощью последнего, запускается механизм поиска, заложенный внутри платформы, и разработчик получает доступ к результирующим данным.
Если говорить о параметрах метода SearchAsync, то в случае календаря, это параметры типа DateTime, которые задают промежуток времени, за который нужно выбрать записи. Третий параметр позволяет передать произвольный объект, который будет переброшен обработчику события SearchCompleted. Этот объект можно использовать на свое усмотрение, например, идентифицировать результат запроса по имени (если у Вас много запросов).
В случае контактов, метод SearchAsync также принимает три параметра. Третий параметр также представляет собой произвольный объект, а вот первый и второй – позволяют задать критерии поиска в списке контактов. Так, первый параметр задает строку для поиска (если она не нужна, то можно указать String.Empty), а второй – тип поиска. Тип поиска представляет собой объект перечислимого типа, принимающего одно из значений:
· None – возвращает все контакты;
· PinnedToStart – возвращает все контакты, привязанные к основному окну телефона;
· EmailAddresses – позволяет выполнять фильтрацию по Email адресам;
· PhoneNumber – позволяет выполнять фильтрацию по номерам телефонов;
· DisplayName – позволяет выполнять фильтрацию по имени контакта.
Естественно, что полученные результаты (в виде списка объектов Contact или Appointment) можно обрабатывать дополнительно, используя LINQ или простой перебор.
Таким образом, работа с контактами и календарем не представляет сложности. Вот пример кода, который может выбирать контакты и записи из календаря, задавая фильтры:
private void PhoneApplicationPage_Loaded(object sender, RoutedEventArgs e) { Microsoft.Phone.UserData.Contacts conts = new Microsoft.Phone.UserData.Contacts(); Appointments apps = new Appointments(); conts.SearchCompleted += new EventHandler<ContactsSearchEventArgs>(conts_SearchCompleted); conts.SearchAsync("B", FilterKind.DisplayName, "My Search 1"); apps.SearchCompleted += new EventHandler<AppointmentsSearchEventArgs>(apps_SearchCompleted); apps.SearchAsync(DateTime.Now, DateTime.Now.AddDays(7), "My Search 2"); } void apps_SearchCompleted(object sender, AppointmentsSearchEventArgs e) { try { appsList.ItemsSource = e.Results; } catch { } } void conts_SearchCompleted(object sender, ContactsSearchEventArgs e) { try { contsList.ItemsSource = e.Results; } catch { } }
В заключении отмечу, что классы Contacts и Appointments имеют свойство Accounts, позволяющее определить доступные источники данных (напомню, что WP 7 может объединять данные из таких источников как Exchange, Facebook, Live и др). Выбирая конкретный контакт или запись в календаре, разработчик получает доступ к аналогичному свойству, позволяющему определить источник данных для конкретного контакта или записи в календаре (кстати, источников может быть несколько).
Соблюдение политики конфиденциальности при публикации WP 7 приложений
Логично, что при попытке использовать камеру, микрофон, Location API и механизмы по доступу к контактам, разработчик должен запросить разрешение у пользователя. При этом, многие политики (например, для приложений, использующих Location API), отображаются еще на этапе установки приложения. Но независимо от того, что отобразил Marketplace, функционал, запрашивающий у пользователя информацию, должен быть реализован внутри приложения.
В зависимости от типа приложения, запросить права на доступ к тем или иным данным можно по-разному. Например, если пользователь создает запись, к которой могут быть привязаны текущие GPS координаты пользователя, то в форме создания записи достаточно поставить галочку «Добавить к записи мое местоположение» (или как-то так). В этом случае разрешение, которое дает пользователь, тесно интегрировано в интерфейс приложения и не отвлекает внимание пользователя всякими всплывающими окнами.
Но если GPS данные используются в главном окне приложения и в зависимости от них формируется интерфейс, то запросить разрешение у пользователя нужно с помощью отдельного окна, которое отобразиться перед формированием основного окна приложения. При этом, если пользователь согласился на определение своего местоположения, то в настройках приложения должен быть функционал, отключающий это разрешение. В противном случае приложение не будет сертифицировано.
Обращаю Ваше внимание на то, что «индусы», проверяющие приложения, не всегда понимают, используется ли местоположение на том или другом экране. Например, мы публиковали приложение, которое отображает записи на карте, сделанные в привязке к GPS. При этом в главном окне отображалась карта, которая использовала уже сохраненные пользователем данные (на что было получено разрешение при создании соответствующих записей) и никоем образом не требовала определения новых GPS данных на основном экране. «Индусы» не разобрались и вернули приложение. В этом случае нужно отправить приложение на повторную сертификацию, «разжевав» работу Вашего приложения в специальном поле Developer’s Notes, присутствующем при публикации приложения в интерфейсе Marketplace. Ведь тестируется интерфейс, а не код вашего приложения и информации не всегда достаточно.
Но описанная мной выше ситуация понятна и предсказуема. Но существует еще одна причина, по которой Ваше приложение может не пройти сертификацию. Дословно это может звучать так: Your application failed the Marketplace prohibited application policy check. При этом комментариев к подобной ошибке всегда минимум. Оказывается, чтобы решить это проблему с сертификацией, достаточно внутри Вашего приложения разместить произвольный текст (абсолютно авторский), который будет доступно рассказывать пользователю, чего будет происходить с его контактами, GPS положением и т .д. Текст может располагаться в том же окне, где пользователь дает свое разрешение или Вы можете разместить ссылку на другую страницу или даже адрес в Интернет, где будет опубликован Ваш текст. Вот этот текст и будет являться необходимой политикой конфиденциальности.
Быстрой публикации Вам.
Сохранение рингтонов из приложения в WP 7.5
Один из популярных способов заработать деньги на пользователях устройств, это продавать уникальные мелодии звонков для их телефонов. Этот бизнес настолько развит в Украине, что реклама соответствующих служб присутствует и на центральных каналах телевидения. Правда, чтобы заниматься подобным бизнесом, необходимо договориться с мобильным оператором, получить короткий номер и решить много других вопросов.
Но если мы говорим о Windows Phone 7.5, то реализовать подобный бизнес тут значительно проще, так как в обновлении платформы появилась возможность устанавливать мелодию звонка из приложения. Это делается с помощью класса SaveRingtoneTask, который инициирует вызов стандартного Windows Phone приложения, позволяющего как сохранить мелодию в общем списке, так и установить мелодию конкретному контакту.
Прежде чем переходить к реализации примера, следует отметить, что в Windows Phone 7.5 присутствуют следующие ограничения на мелодии звонка:
· Мелодия должна быть сохранена в виде mp3 или wma формата;
· Размер файла должен быть менее 1 Мб;
· Продолжительность аудио должна быть менее 40 секунд;
· Файл не должен быть защищен DRM.
Если все эти условия выполнены, то мелодия может быть установлена.
Посмотрим на то, что должен обычный пользователь сделать, чтобы сохранить мелодию звонка на свой телефон. Итак, если Вы обычный пользователь и у Вас есть mp3 (кстати, его нужно еще найти), который Вы хотите загрузить в телефон, то нужно выполнить следующие действия:
1). Преобразовать mp3 файл таким образом, чтобы он удовлетворял критериям выше. Это можно сделать с помощью Expression Encoder или другого аналогичного приложения. Естественно, пользователь ничего о подобных приложениях не знает (как и об ограничениях);
2). Как только у пользователя есть готовый mp3 или wma, то его необходимо синхронизировать с телефоном. Для этого файл добавляется в коллекцию с музыкой, доступной через Zune, после чего необходимо перейти к редактированию файла и установить свойство Genre в значение ringtone (если файл не удовлетворяет критериям, то его тип поменять нельзя).
3). Подключить телефон к компьютеру и синхронизировать созданную мелодию с телефоном.
Как видите, задача не тривиальная и вряд ли под силу простому пользователю. Но это означает, что приложения по установке мелодий будут не только популярны, но и позволят заработатьJ
А вот теперь приведем код примера. Начнем с интерфейса:
<Grid x:Name="LayoutRoot" Background="Transparent"> <Grid.RowDefinitions> <RowDefinition Height="Auto"/> <RowDefinition Height="*"/> </Grid.RowDefinitions> <StackPanel x:Name="TitlePanel" Grid.Row="0" Margin="12,17,0,28"> <TextBlock x:Name="ApplicationTitle" Text="Ringtone Sample" Style="{StaticResource PhoneTextNormalStyle}"/> <TextBlock x:Name="PageTitle" Text="Ringtones" Margin="9,-7,0,0" Style="{StaticResource PhoneTextTitle1Style}"/> <MediaElement Name="mp"></MediaElement> </StackPanel> <Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0"> <ListBox Name="ringList"> <ListBox.ItemTemplate> <DataTemplate> <TextBlock FontSize="32" Text="{Binding RingtoneName}"></TextBlock> </DataTemplate> </ListBox.ItemTemplate> </ListBox> </Grid> </Grid> <phone:PhoneApplicationPage.ApplicationBar> <shell:ApplicationBar IsVisible="True" IsMenuEnabled="True"> <shell:ApplicationBarIconButton IconUri="/Images/appbar.check.rest.png" Text="Ringtone" Click="ApplicationBarIconButton_SetRing_Click"/> <shell:ApplicationBarIconButton IconUri="/Images/appbar.transport.play.rest.png" Text="Play" Click="ApplicationBarIconButton_Ringtone_Click"/> </shell:ApplicationBar> </phone:PhoneApplicationPage.ApplicationBar>
Тут мы добавили список, который будет отображать доступные мелодии. Тут можно ввести такие поля, как описание, автор категория и др., но это Вы сделаете сами. Далее в приложении присутствует ApplicationBar, который содержит две кнопки. Первая кнопка позволяет установить выделенную мелодию в качестве звонка телефона, а вторая – проиграть мелодию прямо в приложении. Чтобы иметь возможность проиграть мелодию, мы также разместили MediaElement. В нашем случае он не имеет визуального отображения.
Определим класс, который будет хранить информацию о мелодиях:
public class RingtoneItem { public string RingtoneName { get; set; } public string RingtonePath { get; set; } }
А теперь перейдем к коду.
В первой части мы загрузим все доступные мелодии, которые поставляются прямо с приложением. В полноценной версии приложения, Вы наверняка будете выбирать список мелодий из какой-то службы, а потом предлагать загрузить ту или другой мелодию в изолированное хранилище и только после этого давать прослушать мелодию. В нашем случае все гораздо примитивнее.
Во второй части приложения мы обрабатываем событие нажатия на кнопки в Application Bar и проигрываем мелодию, либо вызываем метод Show объекта типа SaveRingtoneTask. Обратите внимание, что при передаче параметра этому объекту, правило формирования Uri отличается от принятого внутри приложения. Чтобы Uri смог быть разобран внешним приложением, его необходимо формировать с помощью приставки appdata: или isostore:, в зависимости от того, где находится Ваш файл с мелодией (внутри приложения или загружен в IsolatedStorage).
Вот полный код основной страницы:
SaveRingtoneTask saveRing; List<RingtoneItem> list = new List<RingtoneItem>(); public MainPage() { InitializeComponent(); saveRing = new SaveRingtoneTask(); saveRing.Completed += new EventHandler<TaskEventArgs>(saveRing_Completed); list.Add(new RingtoneItem() { RingtoneName="Mission Impossible", RingtonePath="/Ringtones/mission.wma"}); list.Add(new RingtoneItem() { RingtoneName = "Va Bank", RingtonePath ="/Ringtones/vabank.wma" }); ringList.ItemsSource = list; } void saveRing_Completed(object sender, TaskEventArgs e) { string statusText=""; if (e.TaskResult == TaskResult.OK) { statusText = "Save completed."; } else if (e.TaskResult == TaskResult.Cancel) { statusText = "Save cancelled."; } MessageBox.Show(statusText); } private void ApplicationBarIconButton_Ringtone_Click(object sender, EventArgs e) { if (ringList.SelectedIndex >= 0) { mp.Source = new Uri(((RingtoneItem)ringList.SelectedItem).RingtonePath, UriKind.Relative); mp.Play(); } } private void ApplicationBarIconButton_SetRing_Click(object sender, EventArgs e) { if (ringList.SelectedIndex >= 0) { saveRing.Source = new Uri( "appdata:"+((RingtoneItem)ringList.SelectedItem).RingtonePath); saveRing.Show(); } }
Информация об устройстве и сети в Windows Phone 7.5
Еще одно нововведение в Windows Phone 7.5, это возможность определить информацию о возможном подключении к сети, а также параметры самого устройства. Тут можно выделить два класса с большим количеством статических методов и свойств.
Первый класс DeviceNetworkInformation, который находится в пространстве имен Microsoft.Phone.Net.NetworkInformation, поддерживает следующие свойства:
· CelluralMobileOperator – позволяет вернуть имя мобильного оператора (только строку);
· IsCelluralDataEnabled – возвращает true, если активирована передача данных через сеть оператора;
· IsNetworkAvailable – возвращает true, если имеется хоть какой-то доступ к сети;
· IsWiFiEnabled – возвращает true, если на телефоне активирована возможность подключения к WiFi;
· IsCelluralDataRoumingEnabled – позволяет проверить, включен ли на телефоне роуминг для передачи данных через сеть мобильного оператора.
Как видно, методы выше достаточно примитивны и не отвечают на вопрос, есть ли доступ в данный момент через WiFi или передача ведется через мобильного оператора. Ведь включение на телефоне WiFi не гарантирует его наличие. Иными словами, назначение этих свойств исключительно информационное, позволяющее сделать интерфейс приложения более дружественным для пользователя.
Если Вы все же хотите получать информацию об изменениях в соединении и определять тип соединения, то Вам поможет статическое событие класса DeviceNetworkInformation. Это событие NetworkAvailabilityChanged, передающее обработчику в качестве параметров объект типа NetworkInterfaceInfo, который содержит всю возможную информацию о текущем подключении. Кстати, чтобы получить информацию о всех возможных подключениях, можно воспользоваться классом NetworkInterfaceList, а текущее подключение можно получить через класс NetworkInterface. Но, в отличии от класса DeviceNetworkInformation, перечисленные выше классы были и в версии 7.0.
Второй класс, из рассматриваемых нами, это DeviceStatus, позволяющий определить множество интересных параметров, связанных с устройством. Тут присутствуют следующие статические свойства:
· ApplicationCurrentMemoryUsage – позволяет определить, сколько памяти использует приложение в данный момент;
· ApplicationMemoryUsageLimit – возвращает количество памяти, которое может быть (всего) использовано приложением;
· ApplicationPeakMemoryUsage – позволяет вернуть пиковое значение памяти, которая была использована в ходе работы приложения;
· DeviceFirmwareVersion – определяет версию прошивки;
· DeviceHardwareVersion – определяет версию аппаратного обеспечения (устройства);
· DeviceManufacturer – возвращает имя производителя устройства;
· DeviceName – возвращает имя устройства;
· DeviceTotalMemory – возвращает общее количество памяти;
· IsKeyboardDeployed – позволяет проверить, готово ли клавиатура к использованию (например, выдвинута из телефона);
· IsKeyboardPresent – определяет наличие клавиатуры;
· PowerSource – определяет, использует ли устройство батарею или подключено к сети.
Как видно, тут можно получить много полезной информации, которую использовать не только во время работы пользователя с приложением, но и во время тестирования.
Кроме перечисленных статических свойств, класс DeviceStatus содержит два статических события, позволяющих определять изменения, связанные с клавиатурой и источником энергии. Первое событие KeyboardDeployedChanged, а второе – PowerSourceChanged.
