这篇文章来讲讲exoplayer注册的部分监听事件的作用(如果讲解有误,请在评论区留言令作者改正)
- setPlaybackPreparer()
这个的使用方法是:PlayerView.setPlaybackPreparer()
player_view.setPlaybackPreparer(this)
override fun preparePlayback() {
//当视频无法播放时,用户继续点击播放按钮,调用此方法
showToast("视频已损坏")
}
- 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 中会将"视频播放出了问题"显示在播放器中,效果如下:

- 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版权协议,转载请附上原文出处链接和本声明。