<Windows Phone 8>BackgroundAudio讓你在背景播放音樂(1)

  • 913
  • 0
  • 2015-09-15

<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 應用程式>確定]。

圖片 1

Step2.將自己找好的音樂檔,直接加入至專案。

圖片 2

Step3.MainPage.xaml的畫面我們新增兩顆按鈕,Btn_1、Btn_2,Content分別叫播放、停止。如以下圖。

圖片 3

附上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類別庫]

,點確定。

圖片 4

圖片 5

Step5.新增完類別庫之後,進到Class1.cs裡面,接著我們引用BackgroundAudio。

圖片 6

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 空白鍵 智慧語法就會跳出來。

圖片 8

選擇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();
        }
   }
}

結果在下一章