Обнаружение паузы/возобновления в ExoPlayer

Я два дня искал этот вопрос в github, но не могу найти верный ответ. Я хочу пример для обнаружения pause / resume в ExoPlayer > 2.x. Кто-нибудь может дать мне пример? Я проверил onPlayerStateChanged и проблема не решена.

onPlayerStateChanged   :   STATE_BUFFERING 
onPlayerStateChanged   :   STATE_READY 

Я только что получил этот журнал от onPlayerStateChanged, и он не вызывается во все времена!

Ответ 1

Вам нужно проверить playWhenReady с Player.EventListener. Состояние воспроизведения ExoPlayer не зависит от паузы игрока или нет:

player.addListener(new Player.DefaultEventListener() {
  @Override
  public void onPlayerStateChanged(boolean playWhenReady, int playbackState) {
    if (playWhenReady && playbackState == Player.STATE_READY) {
      // media actually playing
    } else if (playWhenReady) {
      // might be idle (plays after prepare()), 
      // buffering (plays when data available) 
      // or ended (plays when seek away from end)
    } else {
      // player paused in any state
    }
  }
});

Для воспроизведения/приостановки воспроизведения проигрывателя ExoPlayer

player.setPlayWhenReady(boolean)

Последовательность состояний воспроизведения с ExoPlayer с медиа файлом, который никогда не подходит для повторителя, находится в каждом из четырех состояний и не выражает воспроизведение/приостановку:

Player.STATE_IDLE;
Player.STATE_BUFFERING;
Player.STATE_READY;
Player.STATE_ENDED;

Каждый раз, когда плеер должен буферизировать, он идет:

Player.STATE_READY;
Player.STATE_BUFFERING;
Player.STATE_READY;

Настройка playWhenReady не влияет на состояние.

Все ваши медиа на самом деле играют, когда

playWhenReady && playbackState == Player.STATE_READY

Он воспроизводится при готовности. :)

Ответ 2

Вы можете использовать эту функцию:

public boolean isPlaying() {
    return exoPlayer.getPlaybackState() == Player.STATE_READY && exoPlayer.getPlayWhenReady();
}

Ответ 3

Вы можете использовать exoplayer.getPlayWhenReady() чтобы проверить, находится ли проигрыватель в состоянии паузы или в состоянии воспроизведения.

Ответ 4

  У меня было такое же требование, чтобы обнаружить событие нажатия кнопки воспроизведения/паузы exoplayer. Выше ответы в основном говорили о состоянии не о событии нажатия кнопки.

Это то, что я сделал, чтобы обнаружить нажатие кнопки "Воспроизведение/Пауза", работает отлично.

Шаг 1. Создайте пользовательский класс диспетчера элементов управления и переопределите метод dispatchSetPlayWhenReady

class PlayerControlDispatcher : DefaultControlDispatcher() {
    override fun dispatchSetPlayWhenReady(player: Player?, playWhenReady: Boolean): Boolean {
        if(playWhenReady) {
           // Play button clicked
        } else {
          // Paused button clicked
        }
        return super.dispatchSetPlayWhenReady(player, playWhenReady)
    }
}

Шаг 2. Установите класс диспетчера настраиваемых элементов управления PlayerControlDispatcher в представлении проигрывателя.

playerView.setControlDispatcher(PlayerControlDispatcher())

Где playerView - это экземпляр com.google.android.exoplayer2.ui.PlayerView, который мы объявляем в нашем файле макета.

Ответ 5

Это правильный ответ, просто отлично работает! Спасибо @Кришна-Шарма!