Windows Phone… услышав название этой мобильной системы, поневоле начинаешь с теплотой вспоминать своего недавнего, такого необычного мобильного друга, как будто прошло всего пару месяцев с момента смены смартфона на iPhone/Android. А ведь с момента фактической смерти Windows Phone прошло уже почти 10 лет! Увы, время вспять уже не повернуть, а мобильное подразделение Nokia не спасти, однако при наличии навыков разработки мобильных приложений, большом энтузиазме и фанатизме, есть шанс вернуть жизнь своему старому другу! Недавно я снова загорелся диким энтузиазмом и смог вернуть жизнь старенькой «люмии», написав собственные клиенты нужных мне сервисов с нуля — и готов поделиться этим с вами во всех подробностях!
Сегодня вы узнаете о моей мотивации привносить жизнь старым смартфонам, о тонкостях разработки мобильных приложений, чем Windiows Phone был на голову выше Android в техническом плане и о том, почему провал Windows Phone — одна из самых больших потерь мобильного рынка. Интересно? Тогда добро пожаловать в статью!
❯ Предыстория
Пожалуй, довольно большой процент моих читателей и подписчиков когда-либо владел и пользовался смартфонами на Windows Phone. Мнение пользователей этой мобильной платформы во многом разнится — кто-то восхваляет по настоящему продуманный и плавный интерфейс, кто-то ругает Microsoft за «кидалово» с обновлениями, но большинство людей сходится во мнении, что Windows Phone — была действительно необычной и имела собственную изюминку.
Конечно же, Windows Phone была далеко не первым опытом Microsoft на мобильном рынке. До этого, Редмондская компания поддерживала очень крутую платформу для коммуникаторов и КПК под названием Windows Mobile. Фактически, это был полноценный компьютер в кармане — большинство кнопочных телефонов могли максимум запускать простенькие J2ME-приложения, в то время как WM позволял запускать множество самых разных программ — как написанных на C++/Pascal, так и написанных на C#/VB.Net. Мобильная платформа во всём пыталась подражать своему старшему брату — API системы было очень похоже на то, что мы видим в обычной Windows — тут и полноценная оконная система, и waveout для вывода звука, и GDI для вывода графики.
Windows Mobile прочно занимал свою нишу на мобильном рынке: HTC постоянно представляла новые модели коммуникаторов, которые довольно хорошо продавались. Но тут пришёл первый iPhone, который перевернул всё с ног на голову. Оказывается смартфоном можно управлять полностью пальцами, нажимая на красивые, анимированные элементы интерфейса! Это перевернуло всю индустрию — даже Nokia с её Symbian было тяжело конкурировать с продуктом от Apple. Microsoft видела, что пользователи хотят не столько свободы и кастомизации в системе, сколько плавности интерфейса, стабильности и простоты использования.
Плеер Zune HD стал дебютом свежего подхода к созданию интерфейсов — Metro UI. И хотя сам девайс не сыскал особой популярности, став в некоторой степени провальным, Microsoft взяла на вооружение концепцию этого интерфейса, дабы реализовать её уже в полноценной мобильной ОС. В октябре 2010 года выходит первая версия новой мобильной платформы Microsoft — Windows Phone 7, заложившая фундамент той самой системы, которую мы с вами до сих пор вспоминаем с теплотой!
На WP7 вышло весьма много устройств: тут и девайсы от HTC, и смартфоны Lumia от Nokia, и даже продолжение линейки Omnia от Samsung! Но были у этой платформы и серьезные минусы: она базировалась на ядре обычной Windows CE (оно же использовалось в Windows Mobile) и из-за желания повысить безопасность системы, Microsoft отключила возможность использовать код на нативных языках в своих приложениях. Кроме того, во многих аспектах WP7 была достаточно сырая — хотя для неё регулярно выходили обновления.
❯ Почему провал WP — трагедия для мобильного рынка?
Конечно же параллельно с доработкой WP7, Microsoft разрабатывала новую версию ОС, которая должна была объединить мобильные и десктопные приложения в одну общую концепцию. Кроме того, разработчики решили отказаться от лёгкого ядра Windows CE в пользу более тяжелого и продвинутого ядра Windows NT, которое используется в полноценных версиях Windows.
К сожалению, апгрейда с WP7 на WP8 предусмотрено не было, что многие пользователи считают «кидаловом» со стороны Microsoft. Отчасти это так, но проблема была в том, что даже флагманские устройства на WP7 имели 512мб ОЗУ, чего было недостаточно для первой версии WP8. Думаю, в какой-то степени Microsoft просто не хотели портить имидж максимально плавных смартфонов тормозами обновленной системы, хотя примеры шустрой работы на 512мб ОЗУ есть — например, Lumia 520.
Но вот где WP8 была передовой, так это «под капотом». Microsoft смогли сделать что-то невообразимое для мира ARM-устройств: они реализовали нормальный слой абстракции от «железа» и ввели концепцию ACPI, знакомую нам из обычных десктопных ПК. Вкратце, ACPI — это что-то типа списка железа в устройстве, под которое ОС должна найти и загрузить драйверы, не забыв под это всё выделить ресурсы (devicetree в Linux реализует похожую концепцию). Кроме того, Microsoft реализовала полноценный UEFI в своих смартфонах, что позволяло, например, сделать дуалбут в будущем. На практике это всё означает то, что даже неподдерживаемые No-Name смартфоны можно было обновить до Windows 10, банально поменяв пару ключей в реестре: на Android-устройствах такое невообразимо. Фактически, это стандартизация ARM-железа.
На этом технические фишки Windows Phone не заканчиваются. Переходя к пользовательской части, стоит упомянуть фреймворк для построения интерфейса (WPF/Silverlight), который из коробки работает очень шустро, отлично масштабируется под разные размер экрана и предлагает мощные возможности по анимации и кастомизации интерфейса под стиль приложения. Да и само SDK навязывало изначально правильную концепцию программирования, заставляя выделять все задачи в отдельные потоки, не только задействуя дополнительные ядра процессора, но и улучшая пользовательский опыт от приложения (неправильно написанные Android-приложения легко могут подвисать при выполнении какой-то работы).
И третья классная фишка, про которую почему-то все забыли — это поддержка DirectX 11. Конечно в WP7 уже была поддержка Xna (именно на его базе написана Terraria), что позволяло писать игры одновременно для Windows, Xbox 360 и собственно мобилок, но он имел некоторые ограничения и был прослойкой между графическим API (как Direct3D или OpenGL) и самой игрой. Windows Phone 8 же давал настоящий, полноценный DirectX 11 — хотя и поддерживал максимум вторые шейдеры, но при этом умел те фишки, которые не умел Android — инстансинг для оптимальной отрисовки геометрии, установка стейтов «пачками» и эффективное «bindless» управление ресурсами шейдеров. Теоретически, это давало возможность портировать полноценные игры с ПК/Xbox на Windows Phone, хотя на практике не так много кто этим пользовался.
Ну и вспоминая аргумент про кидалово Microsoft с обновлениями, нужно помнить, что обратная совместимость с приложениями для более ранних версий системы была: на Windows Phone 8 можно было играть в годноту с Windows Phone 7 (NFS Undercover, NFS Hot Pursuit, Mirrors Edge и ещё некоторые классные мобильные игры), а на Windows 10 Mobile можно было запускать почти любое приложение для Windows Phone 8.
Так в чём же потеря WP — трагедия для мобильного рынка? А вы посмотрите на свой Android-смартфон сейчас. Сколько в нём ОЗУ? 4гб? 8гб? 12гб? Смущает ли вас то, что Android умудряется неприятно подтормаживать даже с такими ресурсами? А теперь вспомните Lumia 520: Snapdragon 200, 512 мегабайт оперативной памяти. Вот так она работает из коробки:
Думаю, это всё красноречиво объясняет то, что без WP случилась дуополия на рынке — Android продолжает жиреть, впустую жрать ресурсы и при этом практически не получать новых фишек из года в год, а iPhone хоть и остаётся всё такой же плавной и шустрой, ребята из Apple явно не чувствуют конкуренции и их смартфоны стагнируют в плане дизайна и в некоторой степени интерфейса…
❯ Мотивация
Мои давние читатели знают мою любовь к смартфонам прошлых лет. Для меня нет понятия запланированного устаревания: если под устройство есть комплект разработки и документация, то при большом желании я могу дописать нужные мне приложения сам.
Мой проект SelfEco (сам себе экосистема) как раз об этом — почти полгода назад я написал клиент YouTube и ВК для Android 2.2+. Фактически это означает, что мои приложения работали на ВСЕХ Android смартфонах от 2010 года и новее.
Исходным кодом своих приложений я свободно делюсь — как в качестве примера читателям, так и для возможности каких-то фиксов в будущем или даже модов. В 2021-2022 году я ходил с Lumia 640XL с Win10 Mobile на борту, как с основным смартфоном. И в целом, меня все устраивало и всё нравилось: там и годный клиент ВК был (LunaVK), и клиент телеги нормальный, и браузер кое-какие страницы всё ещё нормально переваривал. Но больше всего мне нравится Windows Phone 8 — она работает ещё шустрее и несколько более строгая в плане дизайна. Да и «люмии» сейчас стоят сущие копейки — моя 640XL обошлась мне в 100 российских рублей (~1.5$ по тому курсу), я не шучу. А на онлайн-барахолках можно найти живые, целые аппараты с нормальными аккумуляторами по 200-500 рублей, иногда даже в родных коробочках!
Lumia 1320 и Lumia 640XL — подарки читателя Kotenilla!
Дак почему бы не применить всю эту круть и мощь во благо, учитывая дешевизну смартфонов? Решено: Качаем SDK и пишем собственный клиент ВК и YouTube — это минимально-необходимые для меня приложения!
❯ Подготовка
Для того, чтобы отлаживать и устанавливать сторонние приложения на смартфоны с Windows Phone, их нужно предварительно разблокировать и сделать «Interop Unlock». Процедура несложная и занимает немного времени на большинстве люмий. Дабы сильно не затягивать статью, я не буду описывать процесс разлочки здесь — его можно найти на 4pda для разных поколений устройств.
❯ YouTube
Начинаем с клиента ютуба. Собственно, концепция отнюдь не поменялась с прошлой статьи — мы всё так же используем API Invidous для получения информации о видео. Нативное API YouTube — полная дичь, да ещё и с ограничениями на один токен, в то время как Invidous сам распоряжается токенами и распределяет их как нужно. Нам лишь остаётся написать «морду», которая будет отображать полученные с сервера данные и передавать ссылку на видео в встроенный плеер.
В отличии от Android, никаких проблем с TLS не возникло: смартфон смог без проблем связаться с инстансом Invidous и получить данные о видео в трендах. Сам по себе, формат ответов очень простой и возвращается в виде JSON, который можно описать такой иерархией:
public class VideoInfo
{
public string type { get; set; }
public string title { get; set; }
public string videoId { get; set; }
public string author { get; set; }
public string authorId { get; set; }
public string authorUrl { get; set; }
public bool authorVerified { get; set; }
public List<VideoThumbnail> videoThumbnails { get; set; }
public string description { get; set; }
public string descriptionHtml { get; set; }
public int viewCount { get; set; }
public string viewCountText { get; set; }
public int published { get; set; }
public string publishedText { get; set; }
public int lengthSeconds { get; set; }
public bool liveNow { get; set; }
public bool premium { get; set; }
public bool isUpcoming { get; set; }
}
Практически сразу система нам навязывает распараллелленую парадигму написания кода — часть API банально не имеет синхронных аналогов! Например, из WebRequest убрали GetResponse, дабы неопытные разработчики не делали ошибок и не пытались вызывать долгие I/O операции в главном потоке (что вызывает подвисания приложения). .NET сам по себе имеет крутой механизм тасков (многопоточных задач) и реализацию концепции async/await, которая позволяет подождать выполнение операции, не блокируя остальное приложение.
private void RequestURL(string method, Action<string> onReady, string fmt, params object[] args)
{
string defaultArgs = string.Format("region=RU&hl={0}", "ru");
HttpWebRequest req = WebRequest.CreateHttp("https://vid.priv.au/api/v1/" + method + "?" + defaultArgs + string.Format(fmt, args));
req.Method = "GET";
req.BeginGetResponse((IAsyncResult res) =>
{
HttpWebResponse response = (HttpWebResponse)req.EndGetResponse(res);
StreamReader reader = new StreamReader(response.GetResponseStream());
line = reader.ReadToEnd();
onReady(line);
}, null);
}
public void QueryTrendingList(Action<List<VideoInfo>> onReady)
{
HasPendingOperation = true;
RequestURL("trending", (string json) =>
{
List<VideoInfo> ret = JsonConvert.DeserializeObject<List<VideoInfo>>(json);
onReady(ret);
HasPendingOperation = false;
}, "");
}
Я решил придержаться более привычной мне концепции на коллбэках, которая позволяет более четко обрабатывать ошибки в подобных кейсах, да и в целом я не очень люблю подобный синтаксический сахар (а async/await и есть «сахар», поскольку разворачивается в стейт-машину). В качестве десериализатора (механизма парсинга JSON напрямую в экземпляры классов, используя рефлексию) я использовал классический Newtonsoft.Json.
После того, как механизм получения и обработки данных с сервера был готов, я начал реализовывать интерфейс приложения. И вот тут WP показал себя во всей красе. ListView? RecycleView? Нафиг эти костыли, винфон умеет нормально рисовать элементы интерфейса, которые вы выделили в ScrollView. И что забавно: в Android даже реализация с ScrollView при активной подгрузке данных вызывала лаги — на WP такого нет вообще! Тут всё просто работает из коробки!
Механизм анимаций здесь тоже декларативный и реализован в концепции т.н «сторибордов» — наборов действий, которые позволяют создавать достаточно сложные анимации вручную.
<Storyboard x:Name="progressFadeIn">
<DoubleAnimation
Storyboard.TargetName="progressBar"
Storyboard.TargetProperty="Opacity"
From="0.0" To="1.0"
Duration="0:0:1" />
</Storyboard>
<Storyboard x:Name="progressFadeOut">
<DoubleAnimation
Storyboard.TargetName="progressBar"
Storyboard.TargetProperty="Opacity"
From="1.0" To="0.0"
Duration="0:0:1" />
</Storyboard>
Буквально через пару часов после создания проекта, у меня уже была готова загрузка и отображение списка трендов:
А затем и логика воспроизведения видео, которая запускает встроенный плеер и передаёт в него ссылку на видео — которая выбирается относительно кодека (только mp4), разрешения устройства и предпочтений пользователя:
private void PlayVideo(VideoInfo info, VideoDescriptor desc)
{
int[] resTable = { 240, 360, 480, 720, 1080 };
int desiredResolution = AppSettings.Instance.DesiredQuality == 0 ? (int)Application.Current.Host.Content.ActualHeight : resTable[AppSettings.Instance.DesiredQuality - 1];
FormatStream strm = YTInstance.PickBestFormat(desc, desiredResolution);
Log("Requested video {0}", desc.videoId);
Log("Picked format {0}, while desired {1}", strm.resolution, AppSettings.Instance.DesiredQuality);
Microsoft.Phone.Tasks.MediaPlayerLauncher mpLauncher = new Microsoft.Phone.Tasks.MediaPlayerLauncher();
mpLauncher.Controls = Microsoft.Phone.Tasks.MediaPlaybackControls.All;
mpLauncher.Media = new Uri(strm.url);
mpLauncher.Show();
if (AppSettings.Instance.SaveHistory)
History.AddEntry(info);
}
Кроме того, в приложение нужно было добавить настройки — для этого WP8 не предоставляет встроенных средств, нужно реализовывать логику самому. Впрочем, ничего сложного в этом нет — глобальный синглтон с полями настроек и логикой сохранения/загрузки:
public enum DesiredVideoQuality
{
Auto, // According to screen size
Q240p,
Q360p,
Q480p,
Q720p,
Q1080p
}
public class AppSettings
{
const string ConfigName = "config.json";
public static AppSettings Instance;
public bool LoadPreviews;
public bool SaveHistory;
public int DesiredQuality;
static AppSettings()
{
Instance = new AppSettings();
}
public static void Load()
{
var storage = System.IO.IsolatedStorage.IsolatedStorageFile.GetUserStoreForApplication();
if(storage.FileExists((ConfigName)))
{
StreamReader reader = new StreamReader(storage.OpenFile(ConfigName, FileMode.Open));
string str = "";
while (!reader.EndOfStream)
str += reader.ReadLine();
reader.Close();
Instance = JsonConvert.DeserializeObject<AppSettings>(str);
}
else
{
// Load default settings
Instance.SaveHistory = true;
Instance.LoadPreviews = true;
Instance.DesiredQuality = 0;
}
}
public static void Save()
{
var storage = System.IO.IsolatedStorage.IsolatedStorageFile.GetUserStoreForApplication();
StreamWriter writer = new StreamWriter(storage.CreateFile(ConfigName));
writer.Write(JsonConvert.SerializeObject(Instance));
writer.Close();
}
}
WP предоставляет специальное изолированное хранилище для пользовательских программ — IsolatedStorage, в которое нельзя добраться из остальной системы (без разблокированного загрузчика и режима Mass Storage). Там же можно хранить и конфиги — правда с некоторым API для файлов сильно перемудрили — навязывать распараллеливание чтения обычно маленьких файлов — это совсем уже.
Итак, буквально за сутки разработки у меня получилось реализовать приложение, которое может выводить списки ютуба по региону (тренды/популярное), может искать видео и воспроизводить ролики с различными разрешениями. Кроме того, приложение умеет подгружать превьюшки и имеет собственный раздел истории. Неплохо за 24 часа для программиста, который фактически не имел опыта с платформой UWP/WinRT в прошлом, да?
❯ ВК
Теперь пришло время реализовать клиент ВК! Фактически, ничего сложного в реализации клиента с базовым функционалом нет — это всё такая же «морда» к данным с сервера, к которым добавляется необходимость получать уведомления и реализовывать логику обновления данных.
На этот раз, я решил выбрать API WP8.1: оно гораздо более богатое на возможности и ближе к современному UWP, чем Silverlight из WP8. Так уж сложилось, что API обычного WP8 ближе к WP7 и совместимо с WP8.1 только с помощью специальной прослойки.
Я не ставил целью написать полноценную замену ныне не рабочему официальному клиенту, но я хотел чтобы моё приложение поддерживало базовый функционал:
- Мессенджер: Конечно же, самое важное в нашем клиенте — это мессенджер.
- Музыка: Куда ж без удобной ВК музыки? Её реализация в кастомных клиентах отнюдь несложная, но достаточно костыльная из-за политики ВК в отношении лицензирования аудио. Снова будем идти на хаки, дабы получить работающее приложение!
- Новости: Помимо общения и прослушивания музыки, бывает потребность полистать ленту — дабы узнать новости, или посмотреть свежие мемчики.
Начал я с реализации окна с диалогами и продумывания навигации приложения. WP8.1 всё ещё не имел концепции боковых менюшек, поэтому реализовывать панель навигации пришлось самому. Вместе с ней была реализована верхняя часть, которая содержит в себе заголовок со статусом и анимацию загрузки:
Класс-менеджер для общения с API ВК я решил реализовать по тому же принципу, что и для клиента YouTube: у нас есть два метода на всё-про всё, один сразу десериализовывает ответ в виде объекта Root (для каждого типа ответа — он свой, все они описаны в Data.Packet.Root):
public void RequestMethod<T>(string method, Action<T> onReady, Action<string> onError, string argFormat, params object[] args)
{
string url = string.Format("{0}/method/{1}?access_token={2}&v={3}{4}", APIUrl, method, token, APIVersion, string.Format(argFormat, args));
HttpWebRequest webRequest = WebRequest.CreateHttp(url);
webRequest.Method = "GET";
Log.WriteLine("Requested method {0}", method);
webRequest.BeginGetResponse((IAsyncResult res) =>
{
try
{
Log.WriteLine("Async response");
WebResponse response = webRequest.EndGetResponse(res);
StreamReader reader = new StreamReader(response.GetResponseStream());
string json = reader.ReadToEnd();
Log.WriteLine("Got response");
JObject obj = JObject.Parse(json);
if(obj.Property("error") != null)
{
Log.WriteLine("API error occured: {0} {1}", obj["error"]["error_code"], obj["error"]["error_msg"]);
onError(obj["error"]["error_msg"].ToString());
}
else
{
Log.WriteLine("Deserializing");
T t = JsonConvert.DeserializeObject<T>(json);
if (t != null)
onReady(t);
else
onError("Deserialization failed");
}
}
catch (WebException e)
{
Log.WriteLine("WebException error occured");
onError("WebException: " + e.Message);
}
}, null);
}
До async/await я не дозрел и здесь
Спустя достаточно короткое время, у меня уже была готова подгрузка диалогов:
Реализация обновления во всех разделах одинаковая: есть метод RequestUpdate, который начинает процедуру обновления и получает данные с сервера, а затем ставит в очередь задачу на обновление UI из основного потока с помощью UpdateUI:
private void UpdateUI(Data.Messages.Root root)
{
foreach(Data.Messages.Item item in root.response.items)
{
UI.MessageView msgView = new UI.MessageView();
msgView.SetInfo(item, item.from_id != profile.id);
contentMain.Children.Add(msgView);
}
}
private void RequestUpdate()
{
VKAPI.Instance.RequestMethod<Data.Messages.Root>("messages.getHistory", (Data.Messages.Root root) =>
{
Utils.SubmitOnUiThread(Dispatcher, () =>
{
UpdateUI(root);
});
}, DefaultErrorHandler, "&user_id={0}&count=200", profile.id);
}
И механизма загрузки/отправки сообщений.
В целом, с этим ничего сложного нет, однако теперь самое время разобраться с нотификациями. Пуши я пока-что поднять не смог, вместо них пока что лонгполлинг — достаточно для нотификаций пока приложение находится в фоне, но система со временем «прибивает» неактивные задачи, а сделать «бесконечный» фоновый таск как в Android не выйдет — система очень строго относится к любой фоновой работе.
Пришло время заняться музыкой — вот это действительно важный функционал! Для работы с аудио, я использовал довольно старый, но известный способ, который ВК пока что не пофиксил. Не то чтобы это из вредности, просто сами ВК особо не идут на контакт для интеграции аудио в своё приложение — исключением стали лишь очень крупные клиенты, как Kate Mobile — а значит можно реализовать действительно важные штуки: например, скачивание треков напрямую в музыкальную библиотеку, дабы их можно было послушать оффлайн! Вся работа с музыкой производится через прокси-сервер, поэтому аудио должно быть открыто.
Реализация фонового прослушивания музыки достаточно похожа на другие платформы, но в то же время заметно отличается. Само приложение может воспроизводить звуки с помощью MediaElement или BackgroundMediaPlayer, однако при сворачивании звук будет приостановлен (в отличии от MediaPlayer на Android). Для фонового прослушивания музыки, Microsoft решили сделать отдельный сервис BackgroundMusicPlayer, который запускается при попытке получить доступ к плееру из программы. Общаться с этим сервисом можно через межпроцессные вызовы — RPC и система предоставляет для него API. Вкратце: нам нужно создать фоновую задачу в виде отдельного модуля WinRT, который будет получать RPC-посылки от Foreground приложения и если нужно — отсылать ответы обратно. Ничего сложного!
private void OnReceiveMessage(object sender, MediaPlayerDataReceivedEventArgs e)
{
string method = (string)e.Data["method"];
switch (method)
{
case "play":
string url = (string)e.Data["url"];
BeginPlay(url);
break;
case "info":
string track = (string)e.Data["title"];
string artist = (string)e.Data["artist"];
UpdateSMTC(track, artist);
break;
case "pause":
BackgroundMediaPlayer.Current.Pause();
break;
}
}
Отдельного внимания заслуживает механизм скачивания музыки в библиотеку. В WP, программы не могут просто так «вторгнуться» в личное пространство пользователя — им обязательно нужны разрешения. Но это ладно, запросить разрешение — совсем не проблема. Зато настоящая проблема — ПОЛНОСТЬЮ асинхронный API. Захотел найти дескриптор файла в ФС — асинхронно, захотел его открыть — снова асинхронно. Поскольку у меня вся работа по скачиванию ведется в отдельном воркере и я не боюсь за дедлоки, пришлось лепить костыли с Task.Wait()
HttpWebResponse response = (HttpWebResponse)webReq.EndGetResponse(res);
System.IO.Stream stream = response.GetResponseStream();
byte[] buffer = new byte[response.ContentLength + 128]; // 128 - ID3v1 length
int ptr = 0;
while(ptr < response.ContentLength)
{
int len = 4096;
if (response.ContentLength - ptr < 4096)
len = (int)response.ContentLength - ptr;
ptr += stream.Read(buffer, ptr, len);
onProgress(ptr / response.ContentLength);
}
А ещё ВК возвращает mp3 без ID3-тегов, поэтому мне пришлось вручную их дописывать, дабы музыка в плеере удобно сортировалась:
Utils.ID3Tag.Fill(desc.artist, desc.title, "Неизвестен").CopyTo(buffer, (int)response.ContentLength);
Кроме того, дабы иметь возможность управлять музыкой из других приложений и экрана блокировки, Microsoft предоставляет т.н интерфейс SMTC — общий оверлей окна регулировки громкости, который позволяет управлять воспроизведением музыки. Его реализация простая до жути — просто включаем нужные кнопки (IsPlayEnabled, IsPauseEnabled и.т.п), добавляем обработчик события нажатия кнопки и обновляем информацию и обложку с помощью DisplayUpdater.
❯ Заключение
Вот таким образом, буквально за несколько дней мы реализовали клиенты нужных нам приложений с базовым функционалом. Разработка клиента YT заняла ровно сутки, разработка клиента ВК — двое суток. Но можно ли всем этим добром по настоящему пользоваться и как оно работает на настоящем устройстве? Смотрите ниже:
Весьма достойно, да? Ещё до публикации статьи, я выложил клиент YT на 4pda и в профильный Telegram-чатик — люди благодарны и действительно довольны. Только в англоязычном чате о WP8.1 (не вклюая WM10 и WP7/WP8) более 2х тысяч человек! Так что да, девайсы прошлых лет действительно нужны достаточно большому числу пользователей.
Ну а разработка клиентов для меня была эдаким челленджом — пилить что-то полезное под новым API всегда интересно, дак ещё и сами девайсы очень крутые с точки зрения UX и скорости работы. А вы как считаете? Жду ваше мнение в комментариях!
Возможно, захочется почитать и это:
- ➤ bada — незаслуженно забытая платформа. Какой была «iOS» от Samsung?
- ➤ Видеокарта VGA для микроконтроллера
- ➤ Запускаем матричный принтер от старого банковского терминала
- ➤ SSO (Прошивка и настройка Cisco Catalyst коммутаторов, с привязкой к RADIUS NPS)
- ➤ Как, откуда и зачем появился Bioshock 2
Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.
Это нужный проект?
58.99% Да! Windows Phone должен жить, пусть и силами сторонних разработчиков. Их производительность не сильно уступает современным девайсам!164
26.26% Да, но уровня официальных приложений на чистом энтузиазме всё равно не достичь, так что это всё и останется колхозными поделками.73
14.75% Когда коту нечего делать…41
Проголосовали 278 пользователей. Воздержались 25 пользователей.
Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.
Вам нравятся статьи из рубрики «сам себе экосистема»?
97.22% Конечно нравятся! Чуть ли не уникальный контент!245
Проголосовали 252 пользователя. Воздержались 24 пользователя.
Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.
У вас есть устройство на Windows Phone?
6.19% Есть и активно пользуюсь!21
5.9% Есть или был, слез с него недавно.20
46.9% Есть или был, но уже давно не пользуюсь.159
22.42% Неа, но хотел купить.76
18.58% Неа и никогда не хотел.63
Проголосовали 339 пользователей. Воздержались 18 пользователей.
Сортировка:
по рейтингу
по популярности
по рейтингу
по обновлениям
Лицензия:
Все
Все
Только бесплатные
Только платные
Windows Phone
★
★
★
★
★
★
★
★
★
★
Кроссплатформенный мессенджер, позволяющий общаться с другими пользователями смартфонов через интернет. Программа привязывается к номеру телефона и предоставляет возможность бесплатно обмениваться сообщениями с контактами телефонной книги, используя 3G, 4G интернет, или WiFi соединение.
Лицензия:
Бесплатно
Скачать
Windows Phone
★
★
★
★
★
★
★
★
★
★
VKontakte
Официальный клиент популярной социальной сети ВКонтакте для Windows Phone. Функционал программы максимально приближен к возможностям сайта.
Лицензия:
Бесплатно
Скачать
Windows Phone
★
★
★
★
★
★
★
★
★
★
ОК
Официальный клиент одной из самых популярных российских социальных сетей. С помощью этой программы можно обмениваться фото, читать ленту событий и осуществлять бесплатные звонки через интернет.
Лицензия:
Бесплатно
Скачать
Windows Phone
★
★
★
★
★
★
★
★
★
★
Macromedia Flash Player for Pocket PC
Флэш-проигрыватель от Macromedia, с помощью которого вы сможете запускать файлы в формате .swf на мобильном устройстве под управлением Windows Mobile.
Лицензия:
Бесплатно
Скачать
Windows Phone
★
★
★
★
★
★
★
★
★
★
GPS Satellite
С помощью этого приложения вы сможете очень точно определить ваше текущее местоположение. В нём отобразятся данные широты, долготы, скорости и курса передвижения, горизонтальное положение и положение по вертикали.
Лицензия:
Бесплатно
Скачать
Windows Phone
★
★
★
★
★
★
★
★
★
★
ДругВокруг
Клиент популярной социальной сети ДругВокруг для Windows Phone. Программа позволяет искать интересных людей и зарабатывать рейтинг, встречаясь с ними в реальной жизни.
Лицензия:
Бесплатно
Скачать
Популярные статьи
Игры
Инструкции
Где в папке Стим находятся игры
06 июня 2022
Настройка
Где в Яндекс браузере хранятся пароли
06 июня 2022
Настройка
Блокировка рекламы в Опере
04 июня 2022
Настройка
Гугл хром не открывает страницы
04 июня 2022
Windows Phone
★
★
★
★
★
★
★
★
★
★
Total Commander
Известный файловый менеджер, обладающий широким функционалом. Перед вами версия программы, предназначенная для устройств на Windows Phone.
Лицензия:
Бесплатно
Скачать
Windows Phone
★
★
★
★
★
★
★
★
★
★
Фонарик 7
Многофункциональный фонарик, использующий LED-вспышку или подсветку дисплея. Приложение имеет возможности нескольких режимов подсветки дисплея, использование вспышки в качестве фонарика, звуковое сопровождение в режиме SOS.
Лицензия:
Бесплатно
Скачать
Windows Phone
★
★
★
★
★
★
★
★
★
★
Рыцарская Игра
Вы — стремительный и благородный генерал в реалистическом военном мире. Проложите свой путь к короне мечом и интригой!
Лицензия:
Бесплатно
Скачать
Windows Phone
★
★
★
★
★
★
★
★
★
★
VK Media Player
Это приложение для воспроизведения медиа контента из популярной социальной сети Вконтакте.
Лицензия:
Бесплатно
Скачать
Windows Phone
★
★
★
★
★
★
★
★
★
★
Angry Birds Star Wars
Игра-головоломка, в которой игрок с помощью рогатки должен стрелять птицами по свиньям, расставленным на различных конструкциях.
Лицензия:
Бесплатно
Скачать
Windows Phone
★
★
★
★
★
★
★
★
★
★
Hill Climb Racing
Красочная гоночная игра на основе физики для устройств Windows Phone. При помощи нее вы сможете проехать по невероятным трассам: от сельской местности и американских горок до вулкана.
Лицензия:
Бесплатно
Скачать
Windows Phone
★
★
★
★
★
★
★
★
★
★
2GIS
Удобный городской справочник, который поможет вам найти информацию о практически любой компании вашего города и нужный объект на трехмерной карте. Программа позволяет работать в режиме оффлайн.
Лицензия:
Бесплатно
Скачать
Windows Phone
★
★
★
★
★
★
★
★
★
★
Кино портал
Клиент сайта KinoTuT.Su, в котором вы сможете смотреть свои любимые фильмы и сериалы онлайн.
Лицензия:
Бесплатно
Скачать
Windows Phone
★
★
★
★
★
★
★
★
★
★
Coffee Reader
Программа для чтения электронных книг в большинстве популярных форматах на экране вашего устройства Windows Phone.
Лицензия:
Бесплатно
Скачать
Windows Phone
★
★
★
★
★
★
★
★
★
★
Instagram BETA
Популярная программа для создания и обработки фотографий для устройств Windows Phone. С её помощью можно создавать высококачественные снимки и накладывать на них бесплатные фильтры и эффекты.
Лицензия:
Бесплатно
Скачать
Windows Phone
★
★
★
★
★
★
★
★
★
★
Kill Zombies For Money
Игра, в которой вам предстоит спасать мир от орд зомби, содержащая несколько игровых режимов.
Лицензия:
Бесплатно
Скачать
Windows Phone
★
★
★
★
★
★
★
★
★
★
MetaTrader 4 Mobile
Поможет всегда быть в курсе событий на бирже, отслеживать финансовые новости, видеть движение цены, чтобы вовремя предпринять необходимые действия по управлению своим торговым счетом.
Лицензия:
Бесплатно
Скачать
Windows Phone
★
★
★
★
★
★
★
★
★
★
Minecraft: Pocket Edition
Мобильная версия игры Minecraft для устройств Windows Phone. Погрузитесь в полностью разрушаемый мир при помощи этой программы, играйте в одиночку или с друзьями.
Лицензия:
Бесплатно
Скачать
Windows Phone
★
★
★
★
★
★
★
★
★
★
PC Remote
Приложение для удаленного управления вашим ПК при помощи устройства Windows Phone. Скачайте бесплатно!
Лицензия:
Бесплатно
Скачать
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
Nextgen Reader
Улучшайте чтение RSS-каналов
ЕЩЕ
WolframAlpha
Ваш источник экспертных знаний
ЕЩЕ
Office Lens
Сканируйте и сохраняйте в OneNote
ЕЩЕ
Подборка коллекций
Присоединяйтесь и будьте в курсе
Получайте новости, слушайте подкасты и оставайтесь на связи благодаря этим полезным приложениям
КУПИТЬ
Еда и рестораны
Раскройте кулинарный талант с новыми рецептами или забронируйте столик и оставьте готовку шефу.
КУПИТЬ
Финансы и составление бюджета
Этот набор приложений для управления личными финансами поможет вам организовать бюджет и следить за своевременной оплатой счетов.
КУПИТЬ
Идеальные фотографии
Превратите снимки в произведения искусства! Редактируйте любимые фотографии, делитесь ими с друзьями или ищите другие удачные снимки.
КУПИТЬ
Категории
-
Личные финансы
-
Производительность
-
Дети и семья
-
Здоровье и фитнес
-
Медицина
-
Социальные сети
-
Навигация и карты
-
Служебные программы и средства
-
Персонализация
-
Образование
-
Книги и справочники
-
Развлечения
-
Средства разработчика
-
Образ жизни
-
Бизнес
-
Новости и погода
-
Путешествия
-
Безопасность
-
Покупки
-
Спорт
-
Фотографии и видео
-
Правительство и политика
-
Дизайн мультимедиа
-
Еда и питание
-
Музыка
Если вы видите это сообщение, значит, произошла проблема с загрузкой файлов в стилей (CSS) нашего сайта. Попробуйте сбросить кэш браузера (Ctrl+F5).
Если это не поможет, а вы находитесь в регионе, где возможны ограничения интернет-трафика с российских серверов — воспользуйтесь VPN.
Нигде, на сторонних сайтах лучше не скачивать там вирусы, хотя данная система защищена от вирусов на 100%, но в сторонних магазинах одни и те же приложения, что в официальном, так что я не рекомендовал бы там скачивать, это потеря сил и времени искать какие либо приложения для данной системы. Strij 8 лет назад На сайте 4PDA. Есть каталог. Так же есть дайджест с новинками программ и игр. Качать что либо получится только после регистрации. Зловредов нет. ПрофиСмарт. Та же ситуация. Нужна рега. Не будет зловредов. Заливалы на этих сайтах репутацию свою ценят. Знаете ответ? |
Топ бесплатных приложений
- Лучшие бесплатные
- Приложения
- Мобильное устройство
Показаны позиции 1-25 из 25
-
Phoenix Force
БесплатноПредложения покупок в приложениях
-
Upward
Бесплатно
-
Dictionary
Бесплатно
-
My Piano Phone
Бесплатно
-
Catch
БесплатноПредложения покупок в приложениях
-
OneShot
БесплатноПредложения покупок в приложениях
-
Pirate’s Path
Бесплатно
-
Alchemic Phone 7
Бесплатно
-
Mind Your Step
Бесплатно
-
tileUp
БесплатноПредложения покупок в приложениях
-
FlipSomeTiles HD
БесплатноПредложения покупок в приложениях
-
Top Task List
БесплатноПредложения покупок в приложениях
-
Crime Coast
БесплатноПредложения покупок в приложениях
-
Doors
Бесплатно
-
Doodle God™ Blitz
БесплатноПредложения покупок в приложениях
-
Galactic Rush
БесплатноПредложения покупок в приложениях
-
Solitaire
Бесплатно
-
Stop the Music!
USD$0.99
-
Currency Converter
БесплатноПредложения покупок в приложениях
-
Caledos Runner
БесплатноПредложения покупок в приложениях
-
War Inc — Modern World Combat
БесплатноПредложения покупок в приложениях
-
Persian Santur
Бесплатно
-
MS-DOS Mobile
Бесплатно
-
Cut and Hack
БесплатноПредложения покупок в приложениях
-
Score! World Goals
БесплатноПредложения покупок в приложениях
Показаны позиции 1-25 из 25