Как использовать событие 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;
        }
    }
Другие вопросы по тегам