<Windows Phone 8>BackgroundAudio讓你在背景播放音樂(1)
前言
讓你的App更加生動,在音樂的薰陶之下,讓你的App能展現的更有特色,如果有類似純屬巧合。
說明
1.BackgroundAudio是Windows phone 內建的涵式庫,使用前須引用[ using Microsoft.Phone.BackgroundAudio; ]。
2..本文參考自[MSDN How to play background audio for Windows Phone]。
3.音樂來自網路,版權霹靂布袋戲。
4.不多說來實作。
實作
Step1.首先建一個專案[檔案>新增>新增專案],點[Visual C#>Windows Phone 應用程式>確定]。
Step2.將自己找好的音樂檔,直接加入至專案。
Step3.MainPage.xaml的畫面我們新增兩顆按鈕,Btn_1、Btn_2,Content分別叫播放、停止。如以下圖。
附上Xaml
<Grid x:Name="LayoutRoot" Background="Transparent"> <Grid.RowDefinitions> <RowDefinition Height="Auto"/> <RowDefinition Height="*"/> </Grid.RowDefinitions> <!--TitlePanel 包含應用程式的名稱和頁面標題--> <StackPanel x:Name="TitlePanel" Grid.Row="0" Margin="12,17,0,28"> <TextBlock Text="我的應用程式" Style="{StaticResource PhoneTextNormalStyle}" Margin="12,0"/> <TextBlock Text="頁面名稱" Margin="9,-7,0,0" Style="{StaticResource PhoneTextTitle1Style}"/> </StackPanel> <!--ContentPanel - 其他內容置於此--> <Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0"> <Button x:Name="btn_1" Content="播放" HorizontalAlignment="Left" Margin="10,10,0,0" VerticalAlignment="Top"/> <Button x:Name="btn_2" Content="停止" HorizontalAlignment="Left" Margin="111,10,0,0" VerticalAlignment="Top"/> </Grid> </Grid>
Step4.重點,我們新增一個Windows Phone 類別庫,在方案總管中[點選自己的方案右鍵>加入>新增專案>Windows Phone類別庫]
,點確定。
Step5.新增完類別庫之後,進到Class1.cs裡面,接著我們引用BackgroundAudio。
using Microsoft.Phone.BackgroundAudio;
Step6.接著我們讓Class1繼承AudioPlayerAgent。
public class Class1 : AudioPlayerAgent { }
Step7.開始寫程式,我們子類別要重新去定義父類別的方法或屬性我們就是要用覆寫。
首先我先建一首曲目。
AudioTrack audiotrack = new AudioTrack( new Uri("mo2.mp3", UriKind.RelativeOrAbsolute), "魔王子氣勢曲", "", "魔王子氣勢曲", null);
接下來覆寫OnPlayStateChanged,當播放狀態變更時它會呼叫這方法。
打上protected override 空白鍵 智慧語法就會跳出來。
選擇OnPlayStateChanged之後,程式碼如下,Base.xxxxxx把它刪除。
protected override void OnPlayStateChanged(BackgroundAudioPlayer player, AudioTrack track, PlayState playState) { base.OnPlayStateChanged(player, track, playState); }
再來就是判斷playState它的狀態是什麼來決定它下一步要做什麼動作。程式碼如下
protected override void OnPlayStateChanged(BackgroundAudioPlayer player, AudioTrack track, PlayState playState) { switch(playState) { //播放狀態 case PlayState.Playing: break; //暫停狀態 case PlayState.Paused: break; //停止狀態 case PlayState.Stopped: break; //關閉狀態 case PlayState.Shutdown: break; //準備播放狀態 case PlayState.TrackReady: player.Play(); break; //音樂結束後,變更曲目狀態 case PlayState.TrackEnded: player.Track = GetNewTrack(); break; //音樂倒轉狀態 case PlayState.Rewinding: break; //音樂快轉狀態 case PlayState.FastForwarding: break; //曲目進行緩衝狀態 case PlayState.BufferingStarted: break; //曲目停止緩衝狀態 case PlayState.BufferingStopped: break; } //通知系統以呼叫完成 NotifyComplete(); }
Step8.接下來是OnUserAction,當使用者動作時會呼叫這方法,參考Step7。
判斷Action狀態來決定它下一步要怎動作,程式碼如下。
protected override void OnUserAction(BackgroundAudioPlayer player, AudioTrack track, UserAction action, object param) { switch(action) { //播放動作 case UserAction.Play: //當音訊播放時的狀態,不等於目前播放中的狀態,目前的曲目等於audiotrack,音訊播放。 if (player.PlayerState != PlayState.Playing) { player.Track = this.audiotrack; player.Play(); } break; //暫停動作 case UserAction.Pause: player.Pause(); break; //倒轉動作 case UserAction.Rewind: player.Rewind(); break; //停止播放動作 case UserAction.Stop: player.Stop(); break; //快轉動作 case UserAction.FastForward: player.FastForward(); break; //搜尋曲目動作 case UserAction.Seek: break; //播放下一首的動作 case UserAction.SkipNext: break; //播放上一首的動作 case UserAction.SkipPrevious: break; } NotifyComplete(); }
最後附上完整的類別庫的程式碼,如下:
using System; using System.Net; using System.Windows; using System.Windows.Controls; using System.Windows.Documents; using System.Windows.Ink; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Animation; using System.Windows.Shapes; using Microsoft.Phone.BackgroundAudio; namespace PhoneClassLibrary1 { public class Class1 : AudioPlayerAgent { AudioTrack audiotrack = new AudioTrack( new Uri("mo2.mp3", UriKind.RelativeOrAbsolute), "魔王子氣勢曲", "", "魔王子氣勢曲", null); protected override void OnPlayStateChanged(BackgroundAudioPlayer player, AudioTrack track, PlayState playState) { switch(playState) { //播放狀態 case PlayState.Playing: break; //暫停狀態 case PlayState.Paused: break; //停止狀態 case PlayState.Stopped: break; //關閉狀態 case PlayState.Shutdown: break; //準備播放狀態 case PlayState.TrackReady: player.Play(); break; //音樂結束後,變更曲目狀態 case PlayState.TrackEnded: break; //音樂倒轉狀態 case PlayState.Rewinding: break; //音樂快轉狀態 case PlayState.FastForwarding: break; //曲目進行緩衝狀態 case PlayState.BufferingStarted: break; //曲目停止緩衝狀態 case PlayState.BufferingStopped: break; } //通知系統以呼叫完成 NotifyComplete(); } protected override void OnUserAction(BackgroundAudioPlayer player, AudioTrack track, UserAction action, object param) { switch (action) { //播放動作 case UserAction.Play: //當音訊播放時的狀態,不等於目前播放中的狀態,目前的曲目等於audiotrack,音訊播放。 if (player.PlayerState != PlayState.Playing) { player.Track = this.audiotrack; player.Play(); } break; //暫停動作 case UserAction.Pause: player.Pause(); break; //倒轉動作 case UserAction.Rewind: player.Rewind(); break; //停止播放動作 case UserAction.Stop: player.Stop(); break; //快轉動作 case UserAction.FastForward: player.FastForward(); break; //搜尋曲目動作 case UserAction.Seek: break; //播放下一首的動作 case UserAction.SkipNext: break; //播放上一首的動作 case UserAction.SkipPrevious: break; } NotifyComplete(); } } }
結果在下一章