background img

The New Stuff

Фоновое воспроизведение музыки в metro - приложения

При разработке аудио приложений возникает потребность фонового воспроизведения. То есть при переходе от приложения к рабочему столу чтоб звучание не приостанавливалось. Как это сделать и другое я сейчас покажу :)
1. Создайте проект типу Blank App
2. Перейдите в манифест, на вкладке Declaration добавьте из выпадающего списка Background Task и настройте его так как показано у меня:


Что мы здесь сделали? Добавили фоновую задачу, пометили что это будет аудио и написали на какой странице это все происходит!
3. Вернемся на главную страницу и напишем следующий код:
MediaElement rootMediaElement = new MediaElement();
// код кнопки которая начинает воспроизводить музыку
private async void Button_Click_1(object sender, RoutedEventArgs e)
{
// показали что категория медиа-елемента фоновая
rootMediaElement.AudioCategory = AudioCategory.BackgroundCapableMedia;
// жастко задали путь к фаулу (у меня он как видно в папке Assets)
StorageFolder folder = await Package.Current.InstalledLocation.GetFolderAsync("Assets");
StorageFile file = await folder.GetFileAsync("Something Not Right Here.mp3");
var stream = await file.OpenAsync(FileAccessMode.Read);
rootMediaElement.SetSource(stream, file.ContentType);
rootMediaElement.Play();
}


private async void MediaControl_StopPressed(object sender, object e)
{
await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () => rootMediaElement.Stop());
}

private async void MediaControl_PlayPauseTogglePressed(object sender, object e)
{
await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
{
try
{
if (rootMediaElement.CurrentState == MediaElementState.Stopped)
rootMediaElement.Play();
else
rootMediaElement.Stop();
}
catch (Exception exception)
{
MessageDialog dialog=new MessageDialog(exception.Message);
dialog.ShowAsync();
}
});
}

private async void MediaControl_PausePressed(object sender, object e)
{
await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () => rootMediaElement.Stop());
}

private async void MediaControl_PlayPressed(object sender, object e)
{
await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () => rootMediaElement.Play());
}

Далее нужно после инициализации компонентов в MainPage.xaml.cs написать следующий код:

MediaControl.PlayPressed += MediaControl_PlayPressed;
MediaControl.PausePressed += MediaControl_PausePressed;
MediaControl.PlayPauseTogglePressed += MediaControl_PlayPauseTogglePressed;
MediaControl.StopPressed += MediaControl_StopPressed;

Здесь вызов методов которые написали выше, они нам нужны для того чтоб появились кнопки воспроизведения и т.д. вот в этой меню
Теперь при переходе от приложения к рабочему столу музыка будет продолжать играть.
Еще если приложения многостраничное также хочется чтоб музыка продолжала играть в независимости от того на какой мы странице, чтобы это сделать добавим в наш проект Resource Dictionary и назовём его Generic. Его код будет иметь следующий вид:


Далее подключим наш ресурс в App.xml:
Теперь переходим в App.xaml.cs и пишем следующе:

rootFrame.Style = Resources["RootFrameStyle"] as Style;
rootFrame.Navigate(typeof(MainPage), args.Arguments);
Window.Current.Content = rootFrame;
Window.Current.Activate();

Здесь мы подключили собственный стиль и перешли на главную страницу. Далее изменим чуть-чуть код который уже писали.

MediaElement rootMediaElement;
DependencyObject rootGrid;

private async void Button_Click_1(object sender, RoutedEventArgs e)
{
rootGrid = VisualTreeHelper.GetChild(Window.Current.Content, 0);
rootMediaElement = (MediaElement)VisualTreeHelper.GetChild(rootGrid, 0);

rootMediaElement.AudioCategory = AudioCategory.BackgroundCapableMedia;

StorageFolder folder = await Package.Current.InstalledLocation.GetFolderAsync("Assets");
StorageFile file = await folder.GetFileAsync("Something Not Right Here.mp3");
var stream = await file.OpenAsync(FileAccessMode.Read);
rootMediaElement.SetSource(stream, file.ContentType);
rootMediaElement.Play();
}

Теперь можно добавлять несколько страниц в проект и переходить между ними, а музыка будет продолжать играть. Если вы сделали все правильно то у вас все получиться, я проверял :)
P.S. Если будут какие-то вопросы - задавайте, с радостью отвечу!
Удачи в ПРОграммировнии.
При разработке аудио приложений возникает потребность фонового воспроизведения. То есть при переходе от приложения к рабочему столу чтоб звучание не приостанавливалось. Как это сделать и другое я сейчас покажу :)
1. Создайте проект типу Blank App
2. Перейдите в манифест, на вкладке Declaration добавьте из выпадающего списка Background Task и настройте его так как показано у меня:


Что мы здесь сделали? Добавили фоновую задачу, пометили что это будет аудио и написали на какой странице это все происходит!
3. Вернемся на главную страницу и напишем следующий код:
MediaElement rootMediaElement = new MediaElement();
// код кнопки которая начинает воспроизводить музыку
private async void Button_Click_1(object sender, RoutedEventArgs e)
{
// показали что категория медиа-елемента фоновая
rootMediaElement.AudioCategory = AudioCategory.BackgroundCapableMedia;
// жастко задали путь к фаулу (у меня он как видно в папке Assets)
StorageFolder folder = await Package.Current.InstalledLocation.GetFolderAsync("Assets");
StorageFile file = await folder.GetFileAsync("Something Not Right Here.mp3");
var stream = await file.OpenAsync(FileAccessMode.Read);
rootMediaElement.SetSource(stream, file.ContentType);
rootMediaElement.Play();
}


private async void MediaControl_StopPressed(object sender, object e)
{
await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () => rootMediaElement.Stop());
}

private async void MediaControl_PlayPauseTogglePressed(object sender, object e)
{
await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
{
try
{
if (rootMediaElement.CurrentState == MediaElementState.Stopped)
rootMediaElement.Play();
else
rootMediaElement.Stop();
}
catch (Exception exception)
{
MessageDialog dialog=new MessageDialog(exception.Message);
dialog.ShowAsync();
}
});
}

private async void MediaControl_PausePressed(object sender, object e)
{
await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () => rootMediaElement.Stop());
}

private async void MediaControl_PlayPressed(object sender, object e)
{
await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () => rootMediaElement.Play());
}

Далее нужно после инициализации компонентов в MainPage.xaml.cs написать следующий код:

MediaControl.PlayPressed += MediaControl_PlayPressed;
MediaControl.PausePressed += MediaControl_PausePressed;
MediaControl.PlayPauseTogglePressed += MediaControl_PlayPauseTogglePressed;
MediaControl.StopPressed += MediaControl_StopPressed;

Здесь вызов методов которые написали выше, они нам нужны для того чтоб появились кнопки воспроизведения и т.д. вот в этой меню
Теперь при переходе от приложения к рабочему столу музыка будет продолжать играть.
Еще если приложения многостраничное также хочется чтоб музыка продолжала играть в независимости от того на какой мы странице, чтобы это сделать добавим в наш проект Resource Dictionary и назовём его Generic. Его код будет иметь следующий вид:


Далее подключим наш ресурс в App.xml:
Теперь переходим в App.xaml.cs и пишем следующе:

rootFrame.Style = Resources["RootFrameStyle"] as Style;
rootFrame.Navigate(typeof(MainPage), args.Arguments);
Window.Current.Content = rootFrame;
Window.Current.Activate();

Здесь мы подключили собственный стиль и перешли на главную страницу. Далее изменим чуть-чуть код который уже писали.

MediaElement rootMediaElement;
DependencyObject rootGrid;

private async void Button_Click_1(object sender, RoutedEventArgs e)
{
rootGrid = VisualTreeHelper.GetChild(Window.Current.Content, 0);
rootMediaElement = (MediaElement)VisualTreeHelper.GetChild(rootGrid, 0);

rootMediaElement.AudioCategory = AudioCategory.BackgroundCapableMedia;

StorageFolder folder = await Package.Current.InstalledLocation.GetFolderAsync("Assets");
StorageFile file = await folder.GetFileAsync("Something Not Right Here.mp3");
var stream = await file.OpenAsync(FileAccessMode.Read);
rootMediaElement.SetSource(stream, file.ContentType);
rootMediaElement.Play();
}

Теперь можно добавлять несколько страниц в проект и переходить между ними, а музыка будет продолжать играть. Если вы сделали все правильно то у вас все получиться, я проверял :)
P.S. Если будут какие-то вопросы - задавайте, с радостью отвечу!
Удачи в ПРОграммировнии.

0 коммент.:

Отправить комментарий

Popular Posts