создать радио приложение для андроид
Онлайн радио для Android: пошаговое руководство
Авторизуйтесь
Онлайн радио для Android: пошаговое руководство
Рассказывает Николай Коломийцев, технический директор и Android-разработчик LevelTop.org
Привет, типичные! В этом руководстве расскажу вам о том, как создать свое приложение в Android.
Начну сразу с сути, поэтому определимся с функционалом:
С требованиями разобрались, теперь самое сложное интересное — реализация.
Весь код вы можете найти на GitHub, здесь же я уделю внимание только основным моментам.
Думаю, что SDK у вас установлено и новые проекты вы создавать умеете, поэтому создадим пустой (blank) проект и добавим библиотеки в build.gradle:
Теперь коротко пройдемся по классам:
Также добавим пару layout-файлов для шторки и главного экрана, drawables можно найти здесь:
И добавим нашему Manifest несколько разрешений и служб:
Теперь давайте получим ключ Last.fm API, он нужен нам для того, чтобы по имени исполнителя найти его фотографию и показать ее на главном экране. Для этого нужно перейти на страницу создания аккаунта и войти или зарегистрироваться, после чего вам потребуется создать приложение. Эта операция займет 30 секунд, и мы наконец доберемся до API KEY, его вам нужно ввести в поле LAST_FM_KEY класса Const.java:
Далее предлагаю перейти к способу получения ссылки на прямую трансляцию, ее я беру отсюда. Для этого нам нужно запустить радио и, нажав правой кнопкой мыши в Chrome, выбрать пункт «посмотреть код», после чего выбрать вкладку Network и найти ссылку с самым длинным timeline. Это и будет наш стрим, он уже добавлен в класс Const — аналогичным способом я получил ссылку на HTML-страницу с именем исполнителя и названием трека. В этом коде много костылей, так как парсить HTML — это само по себе странное занятие, но все же я постараюсь его объяснить:
Здесь вы можете видеть получаемый мною нужный фрагмент HTML-страницы:
А это его парсинг, надеюсь, что комментарии будут информативны:
Этот пример кода, вполне возможно, не является лучшей практикой, но все приложение было написано ночью за несколько часов. Парсинг HTML — занятие сложное, и если есть возможность его не использовать, то нужно этой возможностью пользоваться. Надеюсь, мой опыт обработки HTML-страницы кому-то окажется полезным.
Далее парсинг JSON и получение фото пользователя.
Вот пример отправляемого Last.fm JSON-ответа для певицы Adele:
Все, что нас с вами здесь интересует — это изображение размера «mega», парсить мы его будем таким образом:
Теперь немного об ExoPlayer, и почему я не использовал стандартный MediaPlayer. MediaPlayer абсолютно не оптимизирован для таких нагрузок и частенько останавливал трансляцию. Также на старых (старше пятой) версиях Android перемотка, которую я собирался добавить позже, работает так, как будто плеер подгружает всю аудио дорожку между текущим положением и выбранным пользователем. После недолгих поисков выбор пал на ExoPlayer, сейчас коротко опишу его возможности, код ниже можно использовать как отдельный элемент в своем проекте:
Финальный этап урока — это уведомление в шторке, сервис и то, каким образом это работает.
Из главного Activity при начале проигрывания аудио мы запускаем сервис, и он берет всю работу на себя, освобождая работу в Activity. Выглядит это так:
Сервис управляется с помощью Intent. Когда пользователь нажимает на кнопку «play / pause» в шторке, сервис отправляет Intent сам себе и обрабатывает его, так мы отправляем Intent при нажатии:
Поздравляю! Мы разработали клиент-серверное приложение с использованием дополнительных библиотек, воспроизведением аудио, а также работой с сервисами. В конечном итоге получится нечто подобное тому, что вы видите на скриншотах:
Как я создавал приложение для прослушивания интернет радио
Итак, доброго времени суток, дамы и господа! Сегодня мы рассмотрим историю о том, как я создавал приложение для прослушивания интернет радио.
Первая версия программы была сделана ужасно и выглядела так:
Сделал её когда опыта программирования и знаний было немного очень мало. Программа написана на C#, проект типа Windows Forms. О существовании WPF я знал, но толком в нем не разбирался. Программа создана просто – перетаскал на форму PictureBox-ы, поставил кнопку Play/Pause, Label-ы, ListBox, а полосу регулирования громкости скачал с CodeProject, подключил библиотеку Windows Media Player.
Код приложения – это сплошные проверки “if”. Знаю, руки бы мне за такое оторвать! Например, событие происходящее при нажатии на кнопку Play:
if (isPlaying == true)
<
try
<
wmp.controls.stop();
MainButton.BackgroundImage = Properties.Resources.play;
isPlaying = false;
label1.Text = wmp.currentPlaylist.Item[0].name;
if (Properties.Settings.Default.Theme == «Orange»)
<
PlayState.BackgroundImage = Image.FromFile(«Skins/Orange/PlayingSmall_Playing.png»);
>
else if (Properties.Settings.Default.Theme == «Aqua»)
<
PlayState.BackgroundImage = Image.FromFile(«Skins/Aqua/PlayingSmall_Playing.png»);
>
else if (Properties.Settings.Default.Theme == «Red»)
<
PlayState.BackgroundImage = Image.FromFile(«Skins/Red/PlayingSmall_Playing.png»);
>
>
catch
<
MessageBox.Show(«Возникла непредвиденная ошибка.Отсутсвует интернет подключение.\nПроверьте интернет подключение или перезапустите приложение», «Ошибка»);
>
>
else if (isPlaying == false)
<
try
<
wmp.controls.play();
MainButton.BackgroundImage = Properties.Resources.pause;
isPlaying = true;
label1.Text = wmp.currentPlaylist.Item[0].name;
if (Properties.Settings.Default.Theme == «Orange»)
<
PlayState.BackgroundImage = Image.FromFile(«Skins/Orange/PlayingSmall_Pause.png»);
>
else if (Properties.Settings.Default.Theme == «Aqua»)
<
PlayState.BackgroundImage = Image.FromFile(«Skins/Aqua/PlayingSmall_Pause.png»);
>
else if (Properties.Settings.Default.Theme == «Red»)
<
PlayState.BackgroundImage = Image.FromFile(«Skins/Red/PlayingSmall_Pause.png»);
>
>
catch
<
MessageBox.Show(«Возникла непредвиденная ошибка.Отсутсвует интернет подключение.\nПроверьте интернет подключение или перезапустите приложение», «Ошибка»);
>
>
Или проверка изменения радиостанции:
try
<
if (RadioListView.SelectedItems[0].Text == «EuropaPlus»)
<
wmp.URL = «http://cast.radiogroup.com.ua:8000/europaplus»;
wmp.controls.play();
Properties.Settings.Default.LastRadio = «http://cast.radiogroup.com.ua:8000/europaplus»;
label1.Text = wmp.currentPlaylist.Item[0].name;
Properties.Settings.Default.Save();
>
else if (RadioListView.SelectedItems[0].Text == «Наше Радио»)
<
wmp.URL = «http://cast.radiogroup.com.ua:8000/nashe»;
wmp.controls.play();
Properties.Settings.Default.LastRadio = «http://cast.radiogroup.com.ua:8000/nashe»;
label1.Text = wmp.currentPlaylist.Item[0].name;
Properties.Settings.Default.Save();
>
……
Мало того код ужасный, плюс ещё имеется один большой недостаток, а именно, если какая-то радиостанция уйдёт в небытие, то её никак не убрать из программы, разве что подправить код и заново скомпилировать.
Но об этом я тогда даже не задумывался, так как радовался, что сделал, наверное, что-то стоящее и интересное.
Прошло некоторое время. Я учился программировать, экспериментировал. Очередной раз, когда задался вопросом «что бы ещё программировать?» я наткнулся на проект этого убогого радио и решил, что надо переписать программу надо сделать версию получше.
Создал новый проект Windows Forms. Поставил на форму кнопку, пару Label-ов, TabControl, ListBox, тот же самый Slider. Добавил новое окно настроек. Воспроизведение происходит по-прежнему с помощью библиотеки Windows Media Player.
Теперь уже событие клика кнопки Play/Pause выглядит так:
if (!isPlaying)
<
play.BackgroundImage = Properties.Resources.play;
isPlaying = true;
player.controls.pause();
>
else if (isPlaying)
<
play.BackgroundImage = Properties.Resources.pause;
isPlaying = false;
player.controls.play();
>
Загрузка радиостанций идёт из xml файла. То есть теоретически каждый желающий сможет добавить неограниченное количество радиостанций. Структура xml файла:
EuropaPlus
Наше Радио
Premium
EuropaPlus2
RRadio
Kazantip
Kiss FM
Radio Record
Horizon FM
Best FM
Abc Christmas
А вот и код который загружает радиостанции в ListBox:
string fileName = «stations.xml»;
public void LoadStations()
<
if (File.Exists(fileName))
<
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(fileName);
XmlNodeList stationNodes = xmlDoc.SelectNodes(«//stations/station»);
foreach (XmlNode stationNode in stationNodes)
<
string name = stationNode.InnerText;
//FullList – это listbox
FullList.Items.Add(name);
>
xmlDoc.Save(fileName);
>
else
<
MessageBox.Show(«Не найдены радиостанции.Увы мой господин.\nНе судьба!Загрузите их с сайта разработчика или переустановите программу.»);
>
>
Вот что в итоге получилось:
Этому результату я был очень рад.
Опять пролетело какое-то время. Я научился делать приложения для Windows Phone и, соответственно, уже понимал что-то в WPF.
И вот теперь наступает, на мой взгляд, самая интересная часть этой статьи.
Совсем недавно я встретил программу плеер VK – Meridian. Дизайн этой программы мне очень понравился. И тут я задался вопросом: «Почему бы не сделать программу Radio с таким же дизайном, ну или хотя бы что-то подобное?». К тому же был выложен исходник этой программы, которую я попытался изучить. Но сначала ничего дельного из этого не вышло. Пришлось искать. Поискав в google, наткнулся на статью на хабре. Скачал проект.
Создал новый проект WPF. Для приведения окна в желаемый вид добавил в проект скачанные файлы и привязал стиль к главному окну приложения. Поменял цвет окна, расположение значка, добавил новую кнопку “always on top” и вот что в итоге получилось:
Для того, чтобы приложение было удобным и функциональным, решил разделить главное окно на 3 части. В первой части будут типы радиостанций, во второй список радиостанций относящиеся к определенному типу и, наконец, в третьей части будет логотип радиостанции. Стиль кнопки play/pause, volume, settings, listbox и scrollbar взял из исходников того самого Meridian Vk player.
После долгих мучений был получен такой код:
Как мы сделали приложение онлайн-радио для Android
Ответ на пост «Не знал что погода так много весит»
Из цикла «Прилетают как-то инопланетяне», 1996-2017
Прилетают как-то инопланетяне.
И тут я не нашел, что им ответить.
Рассказ о разработке 4x стратегии
Всем привет. Мы ведем разработку пошаговой стратегии командой энтузиастов и недавно посетили выставку разработчиков, после которой нас пригласили на ряд интервью. Хотелось поделиться рассказом о нашем проекте и устройстве команды с сегодняшнего стрима у xyz. Может нашим подписчикам будет интересно)
Для тех, кто не смотрит видео оставлю общее описание тут:
Более подробное описание:
История мира заключается в постоянном противоборстве его населения с высшими силами, пытающимися этот мир уничтожить. Именно этим объясняется сессионность и реиграбельность проекта. В каждой новой партии вы начинаете, по сути, за остатки цивилизаций, уничтоженных в предыдущих циклах существования мира. Многие уже забыли, кто они, но в ходе игры столкнутся с теми же проблемами, что их прародители. Не вдаваясь в подробности и первопричины, о которых будет рассказано в игре, сейчас можно открыть, что существует ряд катаклизмов, один из которых может уничтожить все живое на планете.
Задача игрока, помимо классических действий для 4X, будет заключаться в предвосхищении событий, подготовке и нахождению одного из способов пережить подобные потрясения. Ну а в качестве бонуса однажды в новой сессии можно будет встретить руины своей же бывшей цивилизации и спрятанные там подсказки. Таким образом, эти события отражаются и на игроках, и на мире игры, включая животных и монстров, которые существуют в достаточном количестве. В конечном итоге, ваша фракция либо совершит технологический скачек в одном из трех направлений (магия, технологии или военное дело), либо будет уничтожена, как и во всех предыдущих циклах.
Если рассматривать проект глобально, то наиболее уникальным является влияние действий и принятых решений игрока на свою фракцию. У вас нет заранее подготовленных пресетов, вы вольны пойти в любую часть карты и начать строить там свое любимое королевство, а в случае изменения условий, начать меняться под них. Например, если вы уже пошли в стимпанк-развитие, то на чём будет ездить ваша ратуша, на гусеницах или на колёсах? Будет ли она работать на угле или электричестве? И на всё это с самого начала оказывает дополнительное влияние регион, в котором вы поселились.
Менее глобальные особенности связаны с героями и юнитами. Первые обладают комбинируемыми классами, имеют систему взаимоотношений между собой, от которых зависят доступные действия на карте. Вплоть до того, что герои из противоборствующих фракций, будучи друзьями, не будут вступать в бой между собой. Или помогать в нейтральных сражениях. И наоборот.