Tas*_*eni 3 android kotlin video-player exoplayer2.x
我正在使用 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
}
}
Run Code Online (Sandbox Code Playgroud)
这种方法的问题是我的日志显示Player.STATE_ENDED触发了两次。连锁效应是我的播放列表从
视频 1 -> 视频 3 -> 视频 5 -> 视频 7...
代替
视频 1 -> 视频 2 -> 视频 3 -> 视频 4...
我做了一些研究,我在 Github 上发现了这个问题。我检查了我的代码,我意识到我实际上正在调用一个包含addListener(videoPlayerListener)OnCreate()、OnStart()、OnPause()、OnResume() 和 OnStop() 的方法。为了解决这个问题,我在该addListener行之前添加了以下内容:
try {
player.removeListener(videoPlayerListener)
Log.d(TAG, "Listener temporarily deleted")
}
catch (e: Exception) {}
Run Code Online (Sandbox Code Playgroud)
请注意,我的代码中只有一个函数包含addListener(...)并且我将removeListener()调用直接放在该addListener()行之前。尽管如此,Player.STATE_ENDED每次视频结束时仍然会被调用两次。
我该怎么办?
使用此代码
全局取这样的变量
var isVideoEnded=false
Run Code Online (Sandbox Code Playgroud)
然后在你的听众中做这个
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
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
626 次 |
| 最近记录: |