检测ExoPlayer中的暂停/恢复

时间:2017-12-09 18:27:58

标签: android exoplayer resume pause

我在github搜索了两天这个问题,但我找不到真正的答案。我想在pause / resume中检测ExoPlayer > 2.x的示例。 任何人都可以举个例子吗?我检查了onPlayerStateChanged,问题没有解决。

onPlayerStateChanged   :   STATE_BUFFERING 
onPlayerStateChanged   :   STATE_READY 

我刚从onPlayerStateChanged获取此日志,并且始终未调用此日志!

8 个答案:

答案 0 :(得分:39)

您需要使用Player.EventListener检查playWhenReadyPlayback states of 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

准备好后播放。 :)

答案 1 :(得分:2)

您可以使用exoplayer.getPlayWhenReady()来检查播放器当前处于暂停状态还是播放状态。

答案 2 :(得分:1)

您可以使用此功能:

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

答案 3 :(得分:1)

  

我对检测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的实例。

答案 4 :(得分:1)

Kotlin 2020解决方案方法更新

状态更改和播放错误等事件将报告给已注册的Player.EventListener实例。

Player.EventListener 具有空的默认方法,因此您只需要实现您感兴趣的方法即可。

首先上课,说你的活动,符合。{p> 1。

然后,在类上重写Player.EventListener方法。 外部onIsPlayingChanged方法...

将侦听器添加到播放器实例:

onCreate

您可以检查播放器是否正在使用Player.isPlaying播放(即,位置正在前进)

// Adding player listener for tracking events
player?.addListener(this)

就是这样。很简单。

答案 5 :(得分:0)

必须指出,由于发布了其他答案,因此Player.EventListener中提供了一个新方法。这对我来说很好:

override fun onIsPlayingChanged(isPlaying: Boolean) {
    // your code here
}

如果isPlaying为false,则暂停播放,否则播放。

答案 6 :(得分:0)

请尝试以下代码片段。播放器侦听器(onPlayerStateChanged)不能很好地观察播放/暂停动作的多次调用,也不能在配置播放器时调用。

videoView.setControlDispatcher(object : DefaultControlDispatcher() {
            override fun dispatchSetPlayWhenReady(player: Player, playWhenReady: Boolean): Boolean {
                if (playWhenReady)
                  // Tap on Play button  
                else
                 // Tap on Pause button
                return super.dispatchSetPlayWhenReady(player, playWhenReady)
            }
        })

答案 7 :(得分:0)

对于科特林

ActiveStorage::FixtureSet.blob