如何使用BackgroundAudioPlayer的PlayStateChanged事件?

时间:2014-01-22 02:32:09

标签: c# events windows-phone-8 windows-phone background-agents

在我的应用中,我想知道播放状态的变化。但我不知道如何订阅该事件并获得当前状态。我怎样才能做到这一点?感谢。

我在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;
}

但我觉得这不是使用event和eventargs的正确方法。它也没有给我正确的最新价值。

2 个答案:

答案 0 :(得分: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-30毫秒,并在返回Playing时将其恢复。

答案 1 :(得分: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;
        }
    }