Exoplayer2.x:Player.STATE_ENDED 在视频结束时触发两次,如何在 android 中实现 exoplayer?

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每次视频结束时仍然会被调用两次。

我该怎么办?

Qui*_*ner 6

使用此代码

全局取这样的变量

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)