I'm using Exoplayer to play a video in a playlist. I want to auto play the next video when the current video end. To do this, I added an EventListener to my player. Here's a snippet:
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
}
}
The problem with this approach is that my logs show that Player.STATE_ENDED fires twice. The chain effect of this is that my playlist plays from
video 1 -> video 3 -> video 5 -> video 7...
instead of
video 1 -> video 2 -> video 3 -> video 4...
I did some research and I found this issue on Github. I checked my code and I realized I was actually calling a method that contains addListener(videoPlayerListener) in OnCreate(), OnStart(), OnPause(), OnResume() and OnStop(). To solve this problem, I added the following before the addListener line:
try {
player.removeListener(videoPlayerListener)
Log.d(TAG, "Listener temporarily deleted")
}
catch (e: Exception) {}
Kindly note that there is only one function in my code that contains addListener(...) and I put the removeListener() call directly before the addListener() line. Despite this, Player.STATE_ENDED still gets called twice every single time a video ends.
What do I do?
Use this code
Take a variable like this globally
var isVideoEnded=false
then in your listener do this
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
}
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With