Как использовать событие PlayStateChanged BackgroundAudioPlayer?
В моем приложении я хочу знать, когда изменяется состояние воспроизведения. Но я не знаю, как подписаться на событие и узнать текущее состояние. Как я могу это сделать? Благодарю.
Я вижу заявление в 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;
}
Но я чувствую, что это не правильный способ использования событий и событий. это также не дает мне правильное последнее значение.
2 ответа
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 изменяется на FastForwarding
или же Rewinding
обновите таймер до 20-30 мс и восстановите его, когда он вернется к Playing
,
Используйте это решение, а также ссылку, которую вы получите решение:-
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;
}
}