Windows 8 Store Apps學習(65) 背景工作: 音樂的後台播放和控制

來源:互聯網
上載者:User

介紹

重新想象 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 屬性// 查看本欄目更多精彩內容:http://www.bianceng.cnhttp://www.bianceng.cn/Programming/net/        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

源碼下載:http://files.cnblogs.com/webabcd/Windows8.rar

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.