• 重新想象 Windows 8 Store Apps (65)


    [源码下载]


    重新想象 Windows 8 Store Apps (65) - 后台任务: 音乐的后台播放和控制



    作者:webabcd


    介绍
    重新想象 Windows 8 Store Apps 之 后台任务

    • 音乐的后台播放和控制



    示例
    用于保存每首音乐的相关信息的对象
    BackgroundTask/SongModel.cs

    /*
     * 用于保存每首音乐的相关信息
     */
    
    using System;
    using System.Threading.Tasks;
    using Windows.Storage;
    
    namespace XamlDemo.BackgroundTask
    {
        public class SongModel
        {
            /// <summary>
            /// 音乐文件
            /// </summary>
            public StorageFile File;
    
            /// <summary>
            /// 艺术家
            /// </summary>
            public string Artist;
    
            /// <summary>
            /// 音乐名称
            /// </summary>
            public string Title;
    
            public SongModel(StorageFile file)
            {
                File = file;
            }
    
            /// <summary>
            /// 加载音乐的相关属性
            /// </summary>
            public async Task LoadMusicPropertiesAsync()
            {
                var properties = await this.File.Properties.GetMusicPropertiesAsync();
    
                Artist = properties.Artist;
                Title = properties.Title;
            }
        }
    }


    演示如何通过 MediaControl 实现音乐的后台播放和控制
    BackgroundTask/MediaControlDemo.xaml

    <Page
        x:Class="XamlDemo.BackgroundTask.MediaControlDemo"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="using:XamlDemo.BackgroundTask"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        mc:Ignorable="d">
    
        <Grid Background="Transparent">
            <StackPanel Margin="120 0 0 0">
                
                <TextBlock Name="lblMsg" FontSize="14.667" />
    
                <Button Name="btnSelectFiles" Content="Select Files" Click="btnSelectFiles_Click" Margin="0 10 0 0" />
                <Button Name="btnPlay" Content="Play" Click="btnPlay_Click" Margin="0 10 0 0" />
    
                <!--
                    为了使音乐可以后台播放,需要将 MediaElement 的 AudioCategory 属性设置为 BackgroundCapableMedia
                -->
                <MediaElement Name="mediaElement" AudioCategory="BackgroundCapableMedia" AutoPlay="False" 
                              MediaOpened="mediaElement_MediaOpened" MediaEnded="mediaElement_MediaEnded" CurrentStateChanged="mediaElement_CurrentStateChanged" />
    
            </StackPanel>
        </Grid>
        
    </Page>

    BackgroundTask/MediaControlDemo.cs

    /*
     * 演示如何通过 MediaControl 实现音乐的后台播放和控制
     * 
     * 注:
     * 1、需要在 Package.appxmanifest 中增加后台任务声明,并勾选“音频”
     * 2、需要将 MediaElement 的 AudioCategory 属性设置为 BackgroundCapableMedia
     * 
     * 另:
     * 按下平板上的音量键或者多媒体键盘上的相关按键,会弹出后台音频的控制框,通过 MediaControl 来监听用户在此音频控制框上的操作
     */
    
    using System;
    using System.Collections.Generic;
    using System.Threading.Tasks;
    using Windows.Media;
    using Windows.Storage;
    using Windows.Storage.Pickers;
    using Windows.Storage.Streams;
    using Windows.UI.Core;
    using Windows.UI.Xaml;
    using Windows.UI.Xaml.Controls;
    using Windows.UI.Xaml.Media;
    
    namespace XamlDemo.BackgroundTask
    {
        public sealed partial class MediaControlDemo : Page
        {
            private List<SongModel> _playList = new List<SongModel>(); // 后台需要播放的音乐列表
            private int _currentSongIndex = 0; // 当前播放的音乐
    
            private bool _previousTrackPressedRegistered = false; // MediaControl 是否注册了 PreviousTrackPressed 事件
            private bool _nextTrackPressedRegistered = false; // MediaControl 是否注册了 NextTrackPressed 事件
            
            public MediaControlDemo()
            {
                this.InitializeComponent();
    
                MediaControl.PlayPauseTogglePressed += MediaControl_PlayPauseTogglePressed; // 按下了 play/pause 键
                MediaControl.PlayPressed += MediaControl_PlayPressed; // 按下了 play 键
                MediaControl.PausePressed += MediaControl_PausePressed; // 按下了 pause 键
                MediaControl.StopPressed += MediaControl_StopPressed; // 按下了 stop 键
    
                MediaControl.PreviousTrackPressed += MediaControl_PreviousTrackPressed; // 按下了“上一首”键
                MediaControl.NextTrackPressed += MediaControl_NextTrackPressed; // 按下了“下一首”键
                MediaControl.RewindPressed += MediaControl_RewindPressed; // 按下了“快退”键
                MediaControl.FastForwardPressed += MediaControl_FastForwardPressed; // 按下了“快进”键
    
                MediaControl.SoundLevelChanged += MediaControl_SoundLevelChanged; // 音量级别发生了改变
    
                // MediaControl.RecordPressed += MediaControl_RecordPressed;
                // MediaControl.ChannelDownPressed += MediaControl_ChannelDownPressed;
                // MediaControl.ChannelUpPressed += MediaControl_ChannelUpPressed;
    
                // MediaControl.ArtistName; // 当前播放的音乐的艺术家
                // MediaControl.TrackName; // 当前播放的音乐的名称
                // MediaControl.AlbumArt; // 当前播放的音乐的专辑封面的路径
                // MediaControl.IsPlaying; // 当前音乐是否正在播放
                // MediaControl.SoundLevel; // 当前播放的音乐的音量级别(Muted, Low, Full)
    
                 _previousTrackPressedRegistered = true;
                 _nextTrackPressedRegistered = true;
            }
    
            // 按下了音频控制框上的 play/pause 键
            async void MediaControl_PlayPauseTogglePressed(object sender, object e)
            {
                if (MediaControl.IsPlaying)
                {
                    await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
                    {
                        mediaElement.Pause();
                    });
                    await OutputMessage("Play/Pause Pressed - Pause");
                }
                else
                {
                    await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
                    {
                        mediaElement.Play();
                    });
                    await OutputMessage("Play/Pause Pressed - Play");
                }
            }
    
            // 按下了音频控制框上的 play 键
            async void MediaControl_PlayPressed(object sender, object e)
            {
                await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
                {
                    mediaElement.Play();
                });
                await OutputMessage("Play Pressed");
            }
    
            // 按下了音频控制框上的 pause 键
            async void MediaControl_PausePressed(object sender, object e)
            {
                await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
                {
                    mediaElement.Pause();
                });
                await OutputMessage("Pause Pressed");
            }
    
            // 按下了音频控制框上的 stop 键
            async void MediaControl_StopPressed(object sender, object e)
            {
                await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
                {
                    mediaElement.Stop();
                });
                await OutputMessage("Stop Pressed");
            }
    
            // 按下了音频控制框上的“上一首”键
            async void MediaControl_PreviousTrackPressed(object sender, object e)
            {
                await OutputMessage("Previous Track Pressed");
    
                if (_currentSongIndex > 0)
                {
                    if (_currentSongIndex == (_playList.Count - 1))
                    {
                        if (!_nextTrackPressedRegistered)
                        {
                            MediaControl.NextTrackPressed += MediaControl_NextTrackPressed;
                            _nextTrackPressedRegistered = true;
                        }
                    }
    
                    _currentSongIndex--;
    
                    if (_currentSongIndex == 0)
                    {
                        MediaControl.PreviousTrackPressed -= MediaControl_PreviousTrackPressed;
                        _nextTrackPressedRegistered = false;
                    }
    
                    await SetCurrentPlayingAsync(_currentSongIndex);
                }
    
            }
    
            // 按下了音频控制框上的“下一首”键
            async void MediaControl_NextTrackPressed(object sender, object e)
            {
                await OutputMessage("Next Track Pressed");
    
                if (_currentSongIndex < (_playList.Count - 1))
                {
                    _currentSongIndex++;
                    await SetCurrentPlayingAsync(_currentSongIndex);
    
                    if (_currentSongIndex > 0)
                    {
                        if (!_previousTrackPressedRegistered)
                        {
                            MediaControl.PreviousTrackPressed += MediaControl_PreviousTrackPressed;
                            _previousTrackPressedRegistered = true;
                        }
    
                    }
    
                    if (_currentSongIndex == (_playList.Count - 1))
                    {
                        if (_nextTrackPressedRegistered)
                        {
                            MediaControl.NextTrackPressed -= MediaControl_NextTrackPressed;
                            _nextTrackPressedRegistered = false;
                        }
                    }
                }
            }
    
            // 按下了音频控制框上的“快退”键,即长按“上一首”键
            async void MediaControl_RewindPressed(object sender, object e)
            {
                await OutputMessage("Rewind Pressed");
            }
    
            // 按下了音频控制框上的“快进”键,即长按“下一首”键
            async void MediaControl_FastForwardPressed(object sender, object e)
            {
                await OutputMessage("Fast Forward Pressed");
            }
    
            // 音量级别发生变化时(Muted, Low, Full)
            async void MediaControl_SoundLevelChanged(object sender, object e)
            {
                await OutputMessage("Sound Level Changed");
            }
    
            // 创建一个需要在后台播放的音乐列表
            private async void btnSelectFiles_Click(object sender, RoutedEventArgs e)
            {
                FileOpenPicker openPicker = new FileOpenPicker();
                openPicker.ViewMode = PickerViewMode.List;
                openPicker.SuggestedStartLocation = PickerLocationId.MusicLibrary;
                openPicker.FileTypeFilter.Add(".mp3");
                openPicker.FileTypeFilter.Add(".wma");
                IReadOnlyList<StorageFile> files = await openPicker.PickMultipleFilesAsync();
                if (files.Count > 0)
                {
                    await CreatePlaylist(files);
                    await SetCurrentPlayingAsync(_currentSongIndex);
                }            
            }
    
            // 开始播放
            private async void btnPlay_Click(object sender, RoutedEventArgs e)
            {
                if (MediaControl.IsPlaying)
                {
                    await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
                    {
                        mediaElement.Pause();
                    });
                    await OutputMessage("Play/Pause Pressed - Pause");
                }
                else
                {
                    await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
                    {
                        mediaElement.Play();
                    });
                    await OutputMessage("Play/Pause Pressed - Play");
                }
            }
    
            // MediaElement 打开文件后,如果需要播放则立刻播放
            private void mediaElement_MediaOpened(object sender, RoutedEventArgs e)
            {
                if (MediaControl.IsPlaying)
                {
                    mediaElement.Play();
                }
            }
    
            // 当前音乐播放完后,转到下一首
            private async void mediaElement_MediaEnded(object sender, RoutedEventArgs e)
            {
                if (_currentSongIndex < _playList.Count - 1)
                {
                    _currentSongIndex++;
    
                    await SetCurrentPlayingAsync(_currentSongIndex);
    
                    if (MediaControl.IsPlaying)
                    {
                        mediaElement.Play();
                    }
                }
            }
    
            // 根据前台的操作,设置 MediaControl 的 IsPlaying 属性
            private void mediaElement_CurrentStateChanged(object sender, RoutedEventArgs e)
            {
                if (mediaElement.CurrentState == MediaElementState.Playing)
                {
                    MediaControl.IsPlaying = true;
                    btnPlay.Content = "Pause";
                }
                else
                {
                    MediaControl.IsPlaying = false;
                    btnPlay.Content = "Play";
                }
            }
    
            // 创建音乐列表
            private async Task CreatePlaylist(IReadOnlyList<StorageFile> files)
            {
                if (_previousTrackPressedRegistered)
                {
                    MediaControl.PreviousTrackPressed -= MediaControl_PreviousTrackPressed;
                    _previousTrackPressedRegistered = false;
                }
                if (_nextTrackPressedRegistered)
                {
                    MediaControl.NextTrackPressed -= MediaControl_NextTrackPressed;
                    _nextTrackPressedRegistered = false;
                }
    
                _playList.Clear();
                _currentSongIndex = 0;
    
                if (files.Count > 0)
                {
                    if (files.Count > 1)
                    {
                        MediaControl.NextTrackPressed += MediaControl_NextTrackPressed;
                        _nextTrackPressedRegistered = true;
                    }
    
                    foreach (StorageFile file in files)
                    {
                        SongModel song = new SongModel(file);
                        await song.LoadMusicPropertiesAsync();
                        _playList.Add(song);
                    }
                }
            }
            
            // 指定当前需要播放的音乐
            private async Task SetCurrentPlayingAsync(int playListIndex)
            {
                string errorMessage = null;
                IRandomAccessStream stream = null;
    
                try
                {
                    stream = await _playList[playListIndex].File.OpenAsync(Windows.Storage.FileAccessMode.Read);
                    await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => 
                    {
                        mediaElement.SetSource(stream, _playList[playListIndex].File.ContentType); 
                    });
                }
                catch (Exception e)
                {
                    errorMessage = e.Message;
                }
    
                if (errorMessage != null)
                {
                    await OutputMessage(errorMessage);
                }
    
                MediaControl.ArtistName = _playList[playListIndex].Artist;
                MediaControl.TrackName = _playList[playListIndex].Title;
            }
    
            // 输出信息
            private async Task OutputMessage(string message)
            {
                await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
                {
                    lblMsg.Text = message + ": " + DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss");
                });
            }
        }
    }



    OK
    [源码下载]

  • 相关阅读:
    Windows下做7层软负载方案分析
    蛙蛙推荐:C语言入门之二——编写第一个有意义的小程序
    蛙蛙推荐:C语言入门之一——Linux下的C开发环境搭建小节
    蛙蛙推荐:动手做个网页游戏五子棋
    学习园地:微博项目
    com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field 异常 规格严格
    PostgreSQL Update 根据B表更新A表 规格严格
    SQL 删除重复数据[转] 规格严格
    ntoskrnl.exe占用cpu高 规格严格
    PostgreSQL中RECURSIVE递归查询使用总结[转] 规格严格
  • 原文地址:https://www.cnblogs.com/webabcd/p/3373335.html
Copyright © 2020-2023  润新知