Exoplayer2.x:Player.STATE_ENDED视频结束时触发两次,如何在android中实现exoplayer?
Exoplayer2.x: Player.STATE_ENDED fires twice when a video ends ,how to implement exoplayer in android?
我正在使用 Exoplayer 播放播放列表中的视频。我想在当前视频结束时自动播放下一个视频。为此,我向我的播放器添加了一个 EventListener
。这是一个片段:
private val videoPlayerListener = object: Player.EventListener {
override fun onPlayerStateChanged(playWhenReady: Boolean, playbackState: Int) {
when(playbackState) {
Player.STATE_IDLE -> showLoadingView()
Player.STATE_READY -> hideLoadingView()
Player.STATE_BUFFERING -> showVideoProgressWheel()
Player.STATE_ENDED -> {
Log.d(TAG, "fired")
playNextVideo()
}
}
}
override fun onPlayerError(error: ExoPlaybackException?) {
// handle error event
}
}
这种方法的问题是我的日志显示 Player.STATE_ENDED
触发了两次。这样做的连锁效应是我的播放列表从
开始播放
video 1 -> video 3 -> video 5 -> video 7...
而不是
video 1 -> video 2 -> video 3 -> video 4...
我做了一些研究,我在 Github 上找到了 this issue。我检查了我的代码,我意识到我实际上是在 OnCreate()、OnStart()、OnPause()、OnResume() 和 OnStop() 中调用一个包含 addListener(videoPlayerListener)
的方法。为了解决这个问题,我在 addListener
行之前添加了以下内容:
try {
player.removeListener(videoPlayerListener)
Log.d(TAG, "Listener temporarily deleted")
}
catch (e: Exception) {}
请注意,我的代码中只有一个函数包含 addListener(...)
,我将 removeListener()
调用直接放在 addListener()
行之前。尽管如此,每次视频结束时 Player.STATE_ENDED
仍然会被调用两次。
我该怎么办?
使用此代码
全局取一个这样的变量
var isVideoEnded=false
然后在您的听众中执行此操作
private val videoPlayerListener = object: Player.EventListener {
override fun onPlayerStateChanged(playWhenReady: Boolean, playbackState: Int) {
when(playbackState) {
Player.STATE_IDLE -> showLoadingView()
Player.STATE_READY -> {
hideLoadingView()
isVideoEnded=false
}
Player.STATE_BUFFERING -> showVideoProgressWheel()
Player.STATE_ENDED -> {
if(!isVideoEnded){
playNextVideo()
isVideoEnded=true
}
Log.d(TAG, "fired")
}
}
}
override fun onPlayerError(error: ExoPlaybackException?) {
// handle error event
}
}
我正在使用 Exoplayer 播放播放列表中的视频。我想在当前视频结束时自动播放下一个视频。为此,我向我的播放器添加了一个 EventListener
。这是一个片段:
private val videoPlayerListener = object: Player.EventListener {
override fun onPlayerStateChanged(playWhenReady: Boolean, playbackState: Int) {
when(playbackState) {
Player.STATE_IDLE -> showLoadingView()
Player.STATE_READY -> hideLoadingView()
Player.STATE_BUFFERING -> showVideoProgressWheel()
Player.STATE_ENDED -> {
Log.d(TAG, "fired")
playNextVideo()
}
}
}
override fun onPlayerError(error: ExoPlaybackException?) {
// handle error event
}
}
这种方法的问题是我的日志显示 Player.STATE_ENDED
触发了两次。这样做的连锁效应是我的播放列表从
video 1 -> video 3 -> video 5 -> video 7...
而不是
video 1 -> video 2 -> video 3 -> video 4...
我做了一些研究,我在 Github 上找到了 this issue。我检查了我的代码,我意识到我实际上是在 OnCreate()、OnStart()、OnPause()、OnResume() 和 OnStop() 中调用一个包含 addListener(videoPlayerListener)
的方法。为了解决这个问题,我在 addListener
行之前添加了以下内容:
try {
player.removeListener(videoPlayerListener)
Log.d(TAG, "Listener temporarily deleted")
}
catch (e: Exception) {}
请注意,我的代码中只有一个函数包含 addListener(...)
,我将 removeListener()
调用直接放在 addListener()
行之前。尽管如此,每次视频结束时 Player.STATE_ENDED
仍然会被调用两次。
我该怎么办?
使用此代码
全局取一个这样的变量
var isVideoEnded=false
然后在您的听众中执行此操作
private val videoPlayerListener = object: Player.EventListener {
override fun onPlayerStateChanged(playWhenReady: Boolean, playbackState: Int) {
when(playbackState) {
Player.STATE_IDLE -> showLoadingView()
Player.STATE_READY -> {
hideLoadingView()
isVideoEnded=false
}
Player.STATE_BUFFERING -> showVideoProgressWheel()
Player.STATE_ENDED -> {
if(!isVideoEnded){
playNextVideo()
isVideoEnded=true
}
Log.d(TAG, "fired")
}
}
}
override fun onPlayerError(error: ExoPlaybackException?) {
// handle error event
}
}