首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Exoplayer2.x:当视频结束时,Player.STATE_ENDED会触发两次,如何在android中实现系外播放器?

Exoplayer2.x:当视频结束时,Player.STATE_ENDED会触发两次,如何在android中实现系外播放器?
EN

Stack Overflow用户
提问于 2020-06-18 10:03:44
回答 1查看 1.7K关注 0票数 3

我正在使用Exoplayer播放播放列表中的视频。当当前视频结束时,我想自动播放下一个视频。为此,我向我的播放器添加了一个EventListener。这里有一个片段:

代码语言:javascript
复制
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会触发两次。这的连锁效应是我的播放列表是从

视频1 ->视频3 ->视频5 ->视频7

而不是

视频1 ->视频2 ->视频3 ->视频4

我做了一些研究,发现了本期。我检查了我的代码,并意识到我实际上是在调用一个方法,其中包含了addListener(videoPlayerListener)中的OnCreate()、OnStart()、OnPause()、OnResume()和OnStop()。为了解决这个问题,我在addListener行之前添加了以下内容:

代码语言:javascript
复制
try {
    player.removeListener(videoPlayerListener)
    Log.d(TAG, "Listener temporarily deleted")
}
catch (e: Exception) {}

请注意,我的代码中只有一个函数包含addListener(...),我将removeListener()调用直接放在addListener()行前面。尽管如此,每次视频结束时,Player.STATE_ENDED仍会接到两次电话。

我做什么好?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-06-18 10:30:29

使用此代码

接受这样一个全局变量,

代码语言:javascript
复制
var isVideoEnded=false

然后在你的听众中做这件事

代码语言:javascript
复制
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
    }
}
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62447467

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档