在我的应用中,我想知道播放状态的变化。但我不知道如何订阅该事件并获得当前状态。我怎样才能做到这一点?感谢。
我在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的正确方法。它也没有给我正确的最新价值。
答案 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更改为FastForwarding
或Rewinding
时,将计时器更新为20-30毫秒,并在返回Playing
时将其恢复。
答案 1 :(得分: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;
}
}