1

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

我在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 的正确方法。它也没有给我正确的最新值。

4

2 回答 2

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当播放位置改变时不会触发。为此,我建议使用 aDispatcherTimer并通过我的方法更新您的显示TryGetPosition(但仅在GetTrackOrDefault()返回非 null 时)。我还建议使用亚秒级计时器(200-300 毫秒)来保持“滴答”正确。当 PlayerState 变为FastForwardingRewinding时,将计时器更新为 20-30ms,并在返回时恢复Playing

于 2014-01-22T03:21:51.297 回答
0

使用此解决方案以及您将获得解决方案的链接:-

在此处输入链接描述

 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;
        }
    }
于 2014-01-22T05:56:54.080 回答