ExoPlayer的监听事件(Kotlin)

这篇文章来讲讲exoplayer注册的部分监听事件的作用(如果讲解有误,请在评论区留言令作者改正)

  1. setPlaybackPreparer()
    这个的使用方法是:PlayerView.setPlaybackPreparer()
player_view.setPlaybackPreparer(this)

override fun preparePlayback() {
        //当视频无法播放时,用户继续点击播放按钮,调用此方法
        showToast("视频已损坏")
    }
  1. setErrorMessageProvider()
    这个的使用方法是:PlayerView.setErrorMessageProvider()
player_view.setErrorMessageProvider(PlayerErrorMessageProvider())

private class PlayerErrorMessageProvider : ErrorMessageProvider<ExoPlaybackException> {
        override fun getErrorMessage(e: ExoPlaybackException): Pair<Int, String> {
            if (e.type == ExoPlaybackException.TYPE_RENDERER) {
                println("渲染出了问题")
            }
            //在视频中展示错误提示
            return Pair.create(0, "视频播放出了问题")
        }
    }

在return 中会将"视频播放出了问题"显示在播放器中,效果如下:
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200525204309583.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG在这里插入图片描述

  1. SimpleExoPlayer.addListener()
    用处都写在了代码的注释里;
//监听播放状态以及失败原因
player!!.addListener(this)

 //播放状态监听
    override fun onPlayerStateChanged(playWhenReady: Boolean, playbackState: Int) {
        when (playbackState) {
            Player.STATE_IDLE -> {
                //播放器没有可播放的媒体。
                showToast("播放器没有可播放的媒体")
            }
            Player.STATE_BUFFERING -> {
                //播放器无法立即从当前位置开始播放。这种状态通常需要加载更多数据时发生。
                showToast("正在加载数据")
            }
            Player.STATE_READY -> {
                // 播放器可以立即从当前位置开始播放。如果{@link#getPlayWhenReady()}为true,否则暂停。
                //当点击暂停或者播放时都会调用此方法
                //当跳转进度时,进度加载完成后调用此方法
                showToast("播放器可以立即从当前位置开始")
            }
            Player.STATE_ENDED -> {
            	//播放器完成了播放
                showToast("视频结束了噢")
                
            }
        }
    }

override fun onPlayerError(error: ExoPlaybackException) {
        if (error.type == ExoPlaybackException.TYPE_SOURCE) {
            val cause: IOException = error.sourceException
            //判断是否为播放资源出错
            if (cause is HttpDataSource.HttpDataSourceException) {
                val httpError: HttpDataSource.HttpDataSourceException = cause
                val dataSpec = httpError.dataSpec

                if (httpError is HttpDataSource.InvalidResponseCodeException) {
					//强制转换为InvalidResponseCodeException并检索返回的信息,响应头
                    //就是说,当拿Uri去准备播放时,如果Uri缺少Http/Https开头等情况,就会在这里接收到异常
                    println("1错误 " + httpError.responseMessage)
                    println("1错误 " + httpError.headerFields)
                } else {
                  //尝试httpError.getCause()检索根本原因,请注意它可能为空
                    println("2错误 " + httpError.cause)
                }
            }
        }
        println("xxxxxxxxxx   发生播放异常")
    }

 //轨道改变监听
    override fun onTracksChanged(
        trackGroups: TrackGroupArray,
        trackSelections: TrackSelectionArray
    ) {
    //这里轨道发生改变的情况,一播放视频就会调用,暂未摸清
        println("轨道发生了改变")
    }

4.setControllerVisibilityListener()

player_view.setControllerVisibilityListener(this)

override fun onVisibilityChange(visibility: Int) {
		//当你点击视频时,视频的控制器(即播放按钮,快进按钮等)被显示/隐藏时,调用此方法
        println("xxxxx   onVisibilityChange")
    }

暂时测试到这么多,更多的用法还没测试到,以后摸索了解到更多时将回来更新这篇文章;


版权声明:本文为weixin_45379305原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。