Два дня назад скачал новый пакет для разработки под Windows Phone 7.1 (Mango) и стал изучать новые возможности. Обнаружил, что что класс DeviceExtendedProperties теперь является устаревшим и не рекомендован к использованию (deprecated). На смену ему пришел более понятный и удобный класс DeviceStatus. Вот о нем и поговорим.
Новый класс DeviceStatus относится к тому же пространству имен Microsoft.Phone.Info, что и устаревший DeviceExtendedProperties. Очень удобно, что не нужно запоминать новые названия свойств. Они остались прежними — просто изменился синтаксис. Для примера в старой версии было:
Стало:
Кроме того, в класс DeviceStatus были добавлены новые полезные свойства, связанные с клавиатурой и питанием.
Чтобы увидеть все изменения, я взял за основу свой старый пример Аппаратные характеристики устройства Windows Phone 7 и стал его перерабатывать.
Сначала я запустил старый проект, написанный еще для Windows Phone 7. Затем в меню Project выбрал Properties и в открывшемся окне выбрал в списке Target Windows Phone Version значение Windows Phone 7.1
Теперь осталось заменить устаревшие свойства на новые:
Для удобства я разделил логику кода на две части. В первой части я вывожу на экран значения постоянных свойств: название изготовителя, номера прошивки и общий объем памяти. Стоит отметить, что в устаревшем классе DeviceExtendedProperties можно было получить уникальный номер устройства через свойство DeviceUniqueId. В новом классе аналога не нашлось. Также я обратил внимание, что раньше для общей памяти возвращалось значение 371, а в Mango стало 435 Мб.
Теперь несколько слов о новинках. Появилось новое свойство IsKeyboardPresent, которое определяет наличие аппаратной клавиатуры на устройстве. На эмуляторе всегда возвращается True, так как эмулятор видит вашу настольную клавиатуру. Вспоминается, что на эмуляторе Windows Mobile было такое же поведение. Можно попробовать выдернуть провод клавиатуры из системника и посмотреть на результат, но я решил оставить изучение этого вопроса вам.
Также появилось новое свойство IsKeyboardDeployed, которое работает в связке с предыдущим свойством. С его помощью можно узнать, выдвинул ли пользователь клавиатуру для работы или нет. Перед использованием данного свойства имеет смысл удостовериться в наличии аппаратной клавиатуры при помощи IsKeyboardPresent.
Еще одно полезное свойство — PowerSources. С его помощью можно узнать, работает ли устройство от аккумуляторной батареи или от внешнего источника (электрическая розетка или подключен к компьютеру).
В одной из своих последних публикаций на Хабре, я предложил программистам, которые пишут приложения под Android, написать аналог описываемой програмы. Предлагаю продолжить традицию и рассказать, как можно получить аппаратные характеристики телефона на Android.
Был бы рад также ответу от iPhone-разработчиков.
Новый класс DeviceStatus относится к тому же пространству имен Microsoft.Phone.Info, что и устаревший DeviceExtendedProperties. Очень удобно, что не нужно запоминать новые названия свойств. Они остались прежними — просто изменился синтаксис. Для примера в старой версии было:
textBlockGetManufacture.Text = DeviceExtendedProperties.GetValue("DeviceManufacturer").ToString();
Стало:
textBlockGetManufacture.Text = Microsoft.Phone.Info.DeviceStatus.DeviceManufacturer;
Кроме того, в класс DeviceStatus были добавлены новые полезные свойства, связанные с клавиатурой и питанием.
Чтобы увидеть все изменения, я взял за основу свой старый пример Аппаратные характеристики устройства Windows Phone 7 и стал его перерабатывать.
Сначала я запустил старый проект, написанный еще для Windows Phone 7. Затем в меню Project выбрал Properties и в открывшемся окне выбрал в списке Target Windows Phone Version значение Windows Phone 7.1
Теперь осталось заменить устаревшие свойства на новые:
public MainPage()
{
InitializeComponent();
timer = new DispatcherTimer();
timer.Interval = new TimeSpan(0, 0, 10);
timer.Tick += new EventHandler(timer_Tick);
}
DispatcherTimer timer;
private void butGetInfo_Click(object sender, RoutedEventArgs e)
{
// Производитель
// Устарело
// textBlockGetManufacture.Text = DeviceExtendedProperties.GetValue("DeviceManufacturer").ToString();
// Новое в Windows Phone 7.1 Mango
textBlockGetManufacture.Text = Microsoft.Phone.Info.DeviceStatus.DeviceManufacturer;
// Название устройства
// Устарело
// textBlockGetName.Text = DeviceExtendedProperties.GetValue("DeviceName").ToString();
// Новое в Windows Phone 7.1 Mango
textBlockGetName.Text = Microsoft.Phone.Info.DeviceStatus.DeviceName;
// Уникальный номер устройства
byte[] id = (byte[])DeviceExtendedProperties.GetValue("DeviceUniqueId");
textBlockGetID.Text = BitConverter.ToString(id);
// Версия прошивки
// Устарело
// textBlockGetFirmware.Text = DeviceExtendedProperties.GetValue("DeviceFirmwareVersion").ToString();
// Новое в Windows Phone 7.1 Mango
textBlockGetFirmware.Text = Microsoft.Phone.Info.DeviceStatus.DeviceFirmwareVersion;
// Аппаратная версия
// Устарело
// textBlockGetHardware.Text = DeviceExtendedProperties.GetValue("DeviceHardwareVersion").ToString();
// Новое в Windows Phone 7.1 Mango
textBlockGetHardware.Text = Microsoft.Phone.Info.DeviceStatus.DeviceHardwareVersion;
// Общая память на устройстве
// Устарело
//var maxmem = (long)DeviceExtendedProperties.GetValue("DeviceTotalMemory");
// maxmem /= 1024 * 1024;
//textBlockGetTotalMemory.Text = maxmem.ToString();
// Windows 7.1. Mango
var totalmem = Microsoft.Phone.Info.DeviceStatus.DeviceTotalMemory;
totalmem /= 1024 * 1024;
textBlockGetTotalMemory.Text = totalmem.ToString();
// Новое в Windows 7.1 Mango
// Выдвинута ли клавиатура
textBlockGetKeyboardDeploy.Text = Microsoft.Phone.Info.DeviceStatus.IsKeyboardDeployed.ToString();
// Есть ли физическая клавиатура
textBlockGetPresentKeyboard.Text = Microsoft.Phone.Info.DeviceStatus.IsKeyboardPresent.ToString();
// Источник питания
textBlockGetPowerSource.Text = Microsoft.Phone.Info.DeviceStatus.PowerSource.ToString();
}
private void buttonMemory_Click(object sender, RoutedEventArgs e)
{
timer.Start();
}
void timer_Tick(object sender, EventArgs e)
{
try
{
// Устарело
// textBlockGetCurrentMemory.Text = DeviceExtendedProperties.GetValue("ApplicationCurrentMemoryUsage").ToString();
// textBlockGetPeakMemory.Text = DeviceExtendedProperties.GetValue("ApplicationPeakMemoryUsage").ToString();
// Windows 7.1. Mango
textBlockGetCurrentMemory.Text = Microsoft.Phone.Info.DeviceStatus.ApplicationCurrentMemoryUsage.ToString();
textBlockGetPeakMemory.Text = Microsoft.Phone.Info.DeviceStatus.ApplicationPeakMemoryUsage.ToString();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
Для удобства я разделил логику кода на две части. В первой части я вывожу на экран значения постоянных свойств: название изготовителя, номера прошивки и общий объем памяти. Стоит отметить, что в устаревшем классе DeviceExtendedProperties можно было получить уникальный номер устройства через свойство DeviceUniqueId. В новом классе аналога не нашлось. Также я обратил внимание, что раньше для общей памяти возвращалось значение 371, а в Mango стало 435 Мб.
Новые свойства Mango
Теперь несколько слов о новинках. Появилось новое свойство IsKeyboardPresent, которое определяет наличие аппаратной клавиатуры на устройстве. На эмуляторе всегда возвращается True, так как эмулятор видит вашу настольную клавиатуру. Вспоминается, что на эмуляторе Windows Mobile было такое же поведение. Можно попробовать выдернуть провод клавиатуры из системника и посмотреть на результат, но я решил оставить изучение этого вопроса вам.
Также появилось новое свойство IsKeyboardDeployed, которое работает в связке с предыдущим свойством. С его помощью можно узнать, выдвинул ли пользователь клавиатуру для работы или нет. Перед использованием данного свойства имеет смысл удостовериться в наличии аппаратной клавиатуры при помощи IsKeyboardPresent.
Еще одно полезное свойство — PowerSources. С его помощью можно узнать, работает ли устройство от аккумуляторной батареи или от внешнего источника (электрическая розетка или подключен к компьютеру).
Android, ay
В одной из своих последних публикаций на Хабре, я предложил программистам, которые пишут приложения под Android, написать аналог описываемой програмы. Предлагаю продолжить традицию и рассказать, как можно получить аппаратные характеристики телефона на Android.
Был бы рад также ответу от iPhone-разработчиков.