检测ExoPlayer中的暂停/恢复

b4h*_*r4m 21 resume android exoplayer pause

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

onPlayerStateChanged   :   STATE_BUFFERING 
onPlayerStateChanged   :   STATE_READY 
Run Code Online (Sandbox Code Playgroud)

我刚从这里得到了这个日志,onPlayerStateChanged并没有一直调用它!

mar*_*ger 48

您需要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
    }
  }
});
Run Code Online (Sandbox Code Playgroud)

播放/暂停ExoPlayer提供的播放器

player.setPlayWhenReady(boolean)
Run Code Online (Sandbox Code Playgroud)

ExoPlayer的播放状态序列与媒体文件永远不会停止到拒绝者,在四种状态中都是一次,并且不表示播放/暂停:

Player.STATE_IDLE;
Player.STATE_BUFFERING;
Player.STATE_READY;
Player.STATE_ENDED;
Run Code Online (Sandbox Code Playgroud)

每次玩家需要缓冲它时:

Player.STATE_READY;
Player.STATE_BUFFERING;
Player.STATE_READY;
Run Code Online (Sandbox Code Playgroud)

设置playWhenReady不会影响状态.

所有媒体实际上都在播放

playWhenReady && playbackState == Player.STATE_READY
Run Code Online (Sandbox Code Playgroud)

它准备就绪时播放.:)


Cas*_*ins 11

一定是因为其他答案都贴出来了,Player.EventListener 中提供了一个新方法。这对我很有效:

override fun onIsPlayingChanged(isPlaying: Boolean) {
    // your code here
}
Run Code Online (Sandbox Code Playgroud)

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


Pho*_*ton 8

您可以使用此功能:

public boolean isPlaying() {
    return exoPlayer.getPlaybackState() == Player.STATE_READY && exoPlayer.getPlayWhenReady();
}
Run Code Online (Sandbox Code Playgroud)


Kri*_*rma 6

我有同样的要求来检测 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)
    }
}
Run Code Online (Sandbox Code Playgroud)

步骤 2:将自定义控件调度程序类设置PlayerControlDispatcher到播放器视图中。

playerView.setControlDispatcher(PlayerControlDispatcher())
Run Code Online (Sandbox Code Playgroud)

其中 playerView 是com.google.android.exoplayer2.ui.PlayerView我们在布局文件中声明的实例。


Hel*_*ood 6

Kotlin 2020 解决方案方法更新

\n

状态变化和播放错误等事件会报告给已注册的Player.EventListener实例。

\n

Player.EventListener 有空的默认方法,因此您只需实现您\xe2\x80\x99感兴趣的方法。

\n

首先,你的班级,比如你的活动,必须符合Player.EventListener

\n

然后你重写onIsPlayingChanged类上的方法。外部onCreate方法...

\n

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

\n
// Adding player listener for tracking events\nplayer?.addListener(this)\n
Run Code Online (Sandbox Code Playgroud)\n

您可以使用 Player.isPlaying 检查玩家是否正在玩(即位置正在前进):

\n
//Listening to player events\noverride fun onIsPlayingChanged(isPlaying: Boolean){\n    if (isPlaying) {\n        // Active playback.\n    } else {\n        // Not playing because playback is paused, ended, suppressed, or the player\n        // is buffering, stopped or failed. Check player.getPlaybackState,\n        // player.getPlayWhenReady, player.getPlaybackError and\n        // player.getPlaybackSuppressionReason for details.\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n

就是这样。很简单。

\n