我在Github上搜索了两天,但没有找到确切的答案。我想要一个在ExoPlayer > 2.x
中检测暂停/恢复的例子。有人可以给我一个例子吗?我已经检查了onPlayerStateChanged
,但问题没有解决。
onPlayerStateChanged : STATE_BUFFERING
onPlayerStateChanged : STATE_READY
我刚刚从onPlayerStateChanged
获取了这个日志,但并不总是调用!
请参考Player.isPlaying()
方法,该方法作为API提供。
"而不是需要单独检查这些属性,可以调用Player.isPlaying。"
https://exoplayer.dev/listening-to-player-events.html#playback-state-changes
您需要使用Player.EventListener来检查playWhenReady
。 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
准备好时它会播放。 :)
public boolean isPlaying() {
return exoPlayer.getPlaybackState() == Player.STATE_READY && exoPlayer.getPlayWhenReady();
}
自其他答案发布以来,Player.EventListener 提供了一种新的方法。[编辑:现在是 Player.Listener,因为 Player.EventListener 已弃用]。这对我非常有效:
override fun onIsPlayingChanged(isPlaying: Boolean) {
// your code here
}
如果 isPlaying 为 false,则处于暂停状态,否则正在播放。Kotlin 2020 解决方案更新
诸如状态变化和播放错误之类的事件将报告给已注册的Player.EventListener
实例。
Player.EventListener
具有空默认方法,因此您只需要实现感兴趣的方法。
首先,您的类(例如活动)必须符合 Player.EventListener
接口。
然后,您在类上覆盖 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.
}
}
就是这样。非常简单。
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)
}
}
PlayerControlDispatcher
设置到播放器视图中。playerView.setControlDispatcher(PlayerControlDispatcher())
playerView 是我们在布局文件中声明的 com.google.android.exoplayer2.ui.PlayerView 的实例。
exoplayer.getPlayWhenReady()
来检查播放器当前是否处于暂停状态或播放状态。最初的回答。使用2.16.1版本时,我使用以下代码:
exoPlayer.addListener(object : Player.Listener {
override fun onIsPlayingChanged(isPlaying: Boolean) {
if (isPlaying){
videoIsPlaying()
}
}
})
I think the callback:
fun onPlayWhenReadyChanged(playWhenReady: Boolean, reason: Int)
来自于 Player.Listener
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)
}
})
您必须使用新版本:com.google.android.exoplayer:exoplayer:2.18.6
此函数已过时:
@Deprecated
default void onPlayerStateChanged(boolean playWhenReady, @State int playbackState) {}
新功能是:
default void onPlaybackStateChanged(@State int playbackState) {}
例如:
exoPlayer?.addListener(object : Player.Listener {
override fun onPlaybackStateChanged(@Player.State state: Int) {
when (state) {
Player.STATE_READY -> {
// The player is able to immediately play from its current position. The player will be playing if getPlayWhenReady() is true, and paused otherwise.
}
Player.STATE_BUFFERING -> {
// The player is not able to immediately play the media, but is doing work toward being able to do so. This state typically occurs when the player needs to buffer more data before playback can start.
}
Player.STATE_IDLE -> {
// The player is idle, meaning it holds only limited resources.The player must be prepared before it will play the media.
}
Player.STATE_ENDED -> {
// The player has finished playing the media.
}
else -> {
// Other things
}
}
}
})