Note
Access to this page requires authorization. You can try signing in or changing directories.
Access to this page requires authorization. You can try changing directories.
Если вы ещё не знаете, как написать приложение, которое будет использовать RSS ленту как источник контента, за основу можно взять пример Работа с HTTP в 3 строчки, или делаем свой RSS Reader c WebClient и WebBrowser. Хотите добавить поддержку карт и использовать геолокационные данные, есть пример Карты и гелокационные данные на Windows Phone. После этого, с использованием статьи Обновления Live Tiles в фоновых агентах можно просто добавить подержку Live Tiles в ваше приложение. Если начали задумываться о моентизации - пора читать статью Монетизация приложений — где деньги лежат.
Кажется, что чего-то не хватает? Давайте добавим музыки в наше приложение! Напишем простой плеер, который будет проигрывать онлайн-радио.
Традиционно начнём с создания пустого приложения на основе шаблона Windows Phone Application. В качестве источника онлайнового звукового потока я буду использовать онлайн-вещание Радио Ultra. Я буду использовать 320Kbit-ный поток, и проигрывать буду с использованием MediaElement. Подробнее об использовании Media под Windows Phone можно прочитать в статье Media in Silverlight for Windows Phone.
Приступим собственно к созданию плеера. Добавим элемент управлеия MediaElement в XAML код основной страницы приложения, раскомментируем ApplicationBar и, используя Expression Blend (или вручную) добавим 2 иконки для кнопок ApplicationBar. В итоге, XAML код будет выглядеть следующим образом:
<!--LayoutRoot is the root grid where all page content is placed-->
<Grid x:Name="LayoutRoot" Background="Transparent">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<!--TitlePanel contains the name of the application and page title-->
<StackPanel x:Name="TitlePanel" Grid.Row="0" Margin="12,17,0,28">
<TextBlock x:Name="ApplicationTitle" Text="РАДИО УЛЬТРА"
Style='{StaticResource PhoneTextNormalStyle}'/>
<TextBlock x:Name='PageTitle' Text='онлайн' Margin='9,-7,0,0'
Style='{StaticResource PhoneTextTitle1Style}'/>
</StackPanel>
<!--ContentPanel - place additional content here-->
<Grid x:Name='ContentPanel' Grid.Row='1' Margin='12,0,12,0'>
<MediaElement Name='RadioPlayer' AutoPlay='False'></MediaElement>
</Grid>
</Grid>
<!--Sample code showing usage of ApplicationBar-->
<phone:PhoneApplicationPage.ApplicationBar>
<shell:ApplicationBar IsVisible='True' IsMenuEnabled='True'>
<shell:ApplicationBarIconButton IconUri='/icons/appbar.transport.play.rest.png'
Text='Играть'/>
</shell:ApplicationBar>
</phone:PhoneApplicationPage.ApplicationBar>
По умолчанию, как только у MediaElement появляется источник, он начинает играть. Чтобы этого не происходило, в его свойствах мы выставили значение AutoPlay в false.
Кроме этого, в проекте добавится папка icons с иконками play и pause:
А главная страница приложения будет выглядеть следующим образом:
Осталось добавить немного кода. Перед тем, как начнём писать код, добавим в using блок Microsoft.Phone.Shell, чтобы удобно работать с ApplicaionBarIconButton:
using Microsoft.Phone.Shell;
Первое, что мы добавим – это константу с URL по которому вещает радио. Дальше, необходимо добавить обработчики кнопок ApplicationBar и обработчик состояний MediaElement. Как обычно, я все эти процедуры выполняю в методе Loaded страницы.
const string RadioUltraOnlineURL = "https://188.127.243.169/ultra-320";
// Constructor
public MainPage()
{
InitializeComponent();
Loaded += new RoutedEventHandler(MainPage_Loaded);
}
void MainPage_Loaded(object sender, RoutedEventArgs e)
{
RadioPlayer.Source = new Uri(RadioUltraOnlineURL);
ApplicationBarIconButton PlayPauseButton = ApplicationBar.Buttons[0] as ApplicationBarIconButton;
PlayPauseButton.Click += new EventHandler(PlayPauseButton_Click);
}
void PlayPauseButton_Click(object sender, EventArgs e)
{
if (RadioPlayer.CurrentState == MediaElementState.Playing)
{
RadioPlayer.Pause();
ApplicationBarIconButton PlayPauseButton = (ApplicationBarIconButton)ApplicationBar.Buttons[0];
PlayPauseButton.IconUri = new Uri("icons/appbar.transport.play.rest.png", UriKind.RelativeOrAbsolute);
PlayPauseButton.Text = "играть";
}
else if (RadioPlayer.CurrentState != MediaElementState.Playing)
{
RadioPlayer.Play();
ApplicationBarIconButton PlayPauseButton = this.ApplicationBar.Buttons[0] as ApplicationBarIconButton;
PlayPauseButton.IconUri = new Uri("icons/appbar.transport.pause.rest.png", UriKind.RelativeOrAbsolute);
PlayPauseButton.Text = "пауза";
}
}
Собственно - это минимальный набор кода, без обработки ошибок и состояний буферизации и скачивания, который позволяет добавить проигрывание потоковой онлайн музыки в ваше приложение.
Чтобы не создавать у пользователя ощущения медленного приложения, можно по умолчанию сделать отключённой кнопку проигрывания, а для индинкации соединения и буферизации добавить обработку событий изменения состояния MediaElement - тогда XAML код будет выглядеть следующим образом:
<!--Sample code showing usage of ApplicationBar-->
<phone:PhoneApplicationPage.ApplicationBar>
<shell:ApplicationBar IsVisible="True" IsMenuEnabled="True">
<shell:ApplicationBarIconButton IconUri="/icons/appbar.transport.play.rest.png"
Text="Играть"
IsEnabled="false"/>
</shell:ApplicationBar>
</phone:PhoneApplicationPage.ApplicationBar>
А код C# пополнится двумя обработчиками и дополнительным кодом инициализации в обработчике Loaded:
void MainPage_Loaded(object sender, RoutedEventArgs e)
{
RadioPlayer.Source = new Uri(RadioUltraOnlineURL);
RadioPlayer.MediaOpened += new RoutedEventHandler(RadioPlayer_MediaOpened);
RadioPlayer.CurrentStateChanged += new RoutedEventHandler(RadioPlayer_CurrentStateChanged);
ApplicationBarIconButton PlayPauseButton = ApplicationBar.Buttons[0] as ApplicationBarIconButton;
PlayPauseButton.Click += new EventHandler(PlayPauseButton_Click);
}
void RadioPlayer_CurrentStateChanged(object sender, RoutedEventArgs e)
{
if (RadioPlayer.CurrentState == MediaElementState.Buffering ||
RadioPlayer.CurrentState == MediaElementState.Opening)
{
if (SystemTray.ProgressIndicator == null)
SystemTray.ProgressIndicator = new ProgressIndicator();
SystemTray.ProgressIndicator.IsIndeterminate = true;
SystemTray.ProgressIndicator.IsVisible = true;
SystemTray.ProgressIndicator.Text = "Соединяемся с Радио Ultra ...";
}
else
{
SystemTray.ProgressIndicator.IsIndeterminate = false;
SystemTray.ProgressIndicator.IsVisible = false;
}
}
void RadioPlayer_MediaOpened(object sender, RoutedEventArgs e)
{
if (SystemTray.ProgressIndicator != null)
SystemTray.ProgressIndicator.IsVisible = false;
((ApplicationBarIconButton)ApplicationBar.Buttons[0]).IsEnabled = true;
}
Этого уже достаточно, чтобы поведение приложения было более понятным пользователю. В качестве самостоятельно упражнения добавьте определения наличия сетевого соединения и обработку ошибок.
Проект приложения UltraPlayerDemo
Полезные ссылки:
Windows Phone SDK 7.1
Форумы по разработке под Windows Phone на русском языке