2014-01-22 36 views
1

在我的應用程序中,我想在播放狀態更改時知道。但我不知道如何訂閱該事件並獲得當前狀態。我怎樣才能做到這一點?謝謝。如何使用BackgroundAudioPlayer的PlayStateChanged事件?

我看到一個語句MSDN,但不明白這意味着什麼,如何實現它:

在Windows Phone 8的,你可以檢查PlayStateChangedEventArgs以 同時決定CurrentPlayState和IntermediatePlayState在音頻播放器進入當前播放狀態之前發生了 。

詳情:

在主頁我這樣做:

public MainPage() 
{ 
    BackgroundAudioPlayer.Instance.PlayStateChanged += new EventHandler(Instance_PlayStateChanged); 
} 

然後

private void Instance_PlayStateChanged(object sender, EventArgs e) 
{ 
    var playerState = BackgroundAudioPlayer.Instance.PlayerState; 
} 

但我覺得這是不使用事件的正確方法和EventArgs的。它也不會給我正確的最新價值。

回答

1

PlayerStateChanged事件絕對是確定更改的正確方法,但訂閱它時不會觸發,因此您將無法獲取當前狀態。嘗試這樣的代替:

BackgroundAudioPlayer audioPlayer = BackgroundAudioPlayer.Instance; 

public MainPage() 
{ 
    audioPlayer += OnPlayStateChanged; 
    OnPlayStateChanged(audioPlayer.PlayerState); 
} 

private OnPlayStateChanged(object sender, EventArgs e) 
{ 
    OnPlayStateChanged(audioPlayer.PlayerState); 
} 

private OnPlayStateChanged(PlayState state) 
{ 
    // Process state here 
} 

話雖如此,值得指出兩件大事。

首先,BackgroundAudioPlayer是一個非常易變的API。如果不在正確的內部狀態,它通常會拋出異常。隨意使用我爲Podcaster開發的擴展方法:https://gist.github.com/richardszalay/8552812

其次,當播放位置改變時PlayerStateChanged未被觸發。爲此,我建議使用DispatcherTimer並通過我的TryGetPosition方法更新顯示(但只有當GetTrackOrDefault()返回非空時)。我還建議使用亞秒計時器(200-300ms)來保持「滴答」正確。當PlayerState更改爲FastForwardingRewinding時,將計時器更新爲20-30ms,並在返回到Playing時將其恢復。

+0

大,@Richard。 – user3213376

0

使用此解決方案,以及鏈接,你會得到解決: -

enter link description here

void Instance_PlayStateChanged(object sender, EventArgs e) 
    { 
     switch (BackgroundAudioPlayer.Instance.PlayerState) 
     { 
      case PlayState.Playing: 
      playButton.Content = "pause"; 
      break; 

      case PlayState.Paused: 
      case PlayState.Stopped: 
      playButton.Content = "play"; 
      break; 
     } 

     if (null != BackgroundAudioPlayer.Instance.Track) 
     { 
      txtCurrentTrack.Text = BackgroundAudioPlayer.Instance.Track.Title + 
           " by " + 
           BackgroundAudioPlayer.Instance.Track.Artist; 
     } 
    }