【问题标题】:How to use PlayStateChanged event of BackgroundAudioPlayer?如何使用 BackgroundAudioPlayer 的 PlayStateChanged 事件?
【发布时间】:2014-01-22 02:32:09
【问题描述】:

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

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

【问题讨论】:

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


    【解决方案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-300 毫秒)来保持“滴答”正确。当PlayerState变为FastForwardingRewinding时,将定时器更新为20-30ms,返回Playing时恢复。

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-06-01
        • 2017-06-10
        相关资源
        最近更新 更多