程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> 關於.NET >> Windows 8 Store Apps學習(65) 後台任務: 音樂的後台播放和控制

Windows 8 Store Apps學習(65) 後台任務: 音樂的後台播放和控制

編輯:關於.NET

介紹

重新想象 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 屬性
		// 查看本欄目
		
							
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved