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
    }
}