在 ExoPlayer 中检测 pause/resume
Detect pause/resume in ExoPlayer
我在 github 中搜索了两天这个问题,但找不到真正的答案。我想要在 ExoPlayer > 2.x
中检测 pause / resume
的示例。
任何人都可以给我一个例子吗?我检查了 onPlayerStateChanged
,但问题没有解决。
onPlayerStateChanged : STATE_BUFFERING
onPlayerStateChanged : STATE_READY
我刚从 onPlayerStateChanged
那里得到这个日志,但并不是一直调用它!
编辑---
请参考 Player.isPlaying()
方法,该方法以 API 形式提供。
“不必单独检查这些属性,可以调用 Player.isPlaying。”
https://exoplayer.dev/listening-to-player-events.html#playback-state-changes
--- 编辑结束
您需要检查 playWhenReady
与 Player.EventListener. The Playback 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
}
}
});
给play/pause播放器ExoPlayer提供
player.setPlayWhenReady(boolean)
带有媒体文件的 ExoPlayer 的播放状态序列从不停止重新缓冲,在四种状态中的每一种中都有一次,并且不表示 play/paused:
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
准备就绪后播放。 :)
您可以使用exoplayer.getPlayWhenReady()
查看播放器当前是处于暂停状态还是播放状态。
你可以使用这个功能:
public boolean isPlaying() {
return exoPlayer.getPlaybackState() == Player.STATE_READY && exoPlayer.getPlayWhenReady();
}
I had the same requirement to detect the click event of exoplayer play/pause button. Above answers were mainly talking about the state not
about the button click event.
我就是这样做来检测 Play/Pause 按钮点击的,效果很好。
第 1 步:创建自定义控件调度程序 class 并覆盖方法 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 步:将自定义控件调度程序 class PlayerControlDispatcher
设置到播放器视图中。
playerView.setControlDispatcher(PlayerControlDispatcher())
其中 playerView 是我们在布局文件中声明的 com.google.android.exoplayer2.ui.PlayerView
的一个实例。
肯定是其他答案贴出来后,Player.EventListener又提供了一个新的方法。 [编辑:现在是 Player.Listener,因为 Player.EventListener 已被弃用]。这对我很有效:
override fun onIsPlayingChanged(isPlaying: Boolean) {
// your code here
}
如果 isPlaying 为 false,则暂停,否则播放。
Kotlin 2020 解决方案更新
状态变化和播放错误等事件被报告给已注册的 Player.EventListener
个实例。
Player.EventListener
默认方法为空,所以你只需要实现你感兴趣的方法。
首先你的class,说你的activity,已经符合Player.EventListener
接口。
然后在 class 上覆盖 onIsPlayingChanged
方法。 onCreate
方法之外...
将侦听器添加到您的播放器实例:
// Adding player listener for tracking events
player?.addListener(this)
你可以通过Player.isPlaying:
检查玩家是否在玩(即位置在前进)
//Listening to player events
override fun onIsPlayingChanged(isPlaying: Boolean){
if (isPlaying) {
// Active playback.
} else {
// Not playing because playback is paused, ended, suppressed, or the player
// is buffering, stopped or failed. Check player.getPlaybackState,
// player.getPlayWhenReady, player.getPlaybackError and
// player.getPlaybackSuppressionReason for details.
}
}
就是这样。很简单。
请尝试截取下面的代码。播放器侦听器 (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)
}
})
科特林
private fun ExoPlayer.isPlaying() =
playbackState == Player.STATE_READY && playWhenReady
我认为回调:
fun onPlayWhenReadyChanged(playWhenReady: Boolean, reason: Int)
来自Player.Listener
对于版本 2.16.1,我使用此代码:
exoPlayer.addListener(object : Player.Listener {
override fun onIsPlayingChanged(isPlaying: Boolean) {
if (isPlaying){
videoIsPlaying()
}
}
})
我在 github 中搜索了两天这个问题,但找不到真正的答案。我想要在 ExoPlayer > 2.x
中检测 pause / resume
的示例。
任何人都可以给我一个例子吗?我检查了 onPlayerStateChanged
,但问题没有解决。
onPlayerStateChanged : STATE_BUFFERING
onPlayerStateChanged : STATE_READY
我刚从 onPlayerStateChanged
那里得到这个日志,但并不是一直调用它!
编辑---
请参考 Player.isPlaying()
方法,该方法以 API 形式提供。
“不必单独检查这些属性,可以调用 Player.isPlaying。”
https://exoplayer.dev/listening-to-player-events.html#playback-state-changes
--- 编辑结束
您需要检查 playWhenReady
与 Player.EventListener. The Playback 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
}
}
});
给play/pause播放器ExoPlayer提供
player.setPlayWhenReady(boolean)
带有媒体文件的 ExoPlayer 的播放状态序列从不停止重新缓冲,在四种状态中的每一种中都有一次,并且不表示 play/paused:
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
准备就绪后播放。 :)
您可以使用exoplayer.getPlayWhenReady()
查看播放器当前是处于暂停状态还是播放状态。
你可以使用这个功能:
public boolean isPlaying() {
return exoPlayer.getPlaybackState() == Player.STATE_READY && exoPlayer.getPlayWhenReady();
}
I had the same requirement to detect the click event of exoplayer play/pause button. Above answers were mainly talking about the state not about the button click event.
我就是这样做来检测 Play/Pause 按钮点击的,效果很好。
第 1 步:创建自定义控件调度程序 class 并覆盖方法 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 步:将自定义控件调度程序 class PlayerControlDispatcher
设置到播放器视图中。
playerView.setControlDispatcher(PlayerControlDispatcher())
其中 playerView 是我们在布局文件中声明的 com.google.android.exoplayer2.ui.PlayerView
的一个实例。
肯定是其他答案贴出来后,Player.EventListener又提供了一个新的方法。 [编辑:现在是 Player.Listener,因为 Player.EventListener 已被弃用]。这对我很有效:
override fun onIsPlayingChanged(isPlaying: Boolean) {
// your code here
}
如果 isPlaying 为 false,则暂停,否则播放。
Kotlin 2020 解决方案更新
状态变化和播放错误等事件被报告给已注册的 Player.EventListener
个实例。
Player.EventListener
默认方法为空,所以你只需要实现你感兴趣的方法。
首先你的class,说你的activity,已经符合Player.EventListener
接口。
然后在 class 上覆盖 onIsPlayingChanged
方法。 onCreate
方法之外...
将侦听器添加到您的播放器实例:
// Adding player listener for tracking events
player?.addListener(this)
你可以通过Player.isPlaying:
检查玩家是否在玩(即位置在前进)//Listening to player events
override fun onIsPlayingChanged(isPlaying: Boolean){
if (isPlaying) {
// Active playback.
} else {
// Not playing because playback is paused, ended, suppressed, or the player
// is buffering, stopped or failed. Check player.getPlaybackState,
// player.getPlayWhenReady, player.getPlaybackError and
// player.getPlaybackSuppressionReason for details.
}
}
就是这样。很简单。
请尝试截取下面的代码。播放器侦听器 (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)
}
})
科特林
private fun ExoPlayer.isPlaying() =
playbackState == Player.STATE_READY && playWhenReady
我认为回调:
fun onPlayWhenReadyChanged(playWhenReady: Boolean, reason: Int)
来自Player.Listener
对于版本 2.16.1,我使用此代码:
exoPlayer.addListener(object : Player.Listener {
override fun onIsPlayingChanged(isPlaying: Boolean) {
if (isPlaying){
videoIsPlaying()
}
}
})