ExoPlayer 2.18.1初始化适配:报错修复后无媒体播放求助
ExoPlayer 2.18.1 升级适配与播放故障修复
原代码错误原因解析
升级到ExoPlayer 2.18.1后,原初始化代码的三个错误均由API变更导致:
- Unresolved reference: ExoPlayerFactory:
ExoPlayerFactory已被官方废弃,需改用ExoPlayer.Builder创建播放器实例 - Type mismatch: Uri vs MediaItem:
ProgressiveMediaSource.Factory.createMediaSource()方法不再直接接收Uri,必须传入MediaItem对象 - Variable expected:旧版本中
repeatMode的设置语法在新版中调整,需确保正确引用播放器实例的属性
适配后的正确代码(保留原逻辑)
以下代码完全保留原函数的自定义DataSource、ProgressiveMediaSource等核心逻辑,适配2.18.1版本API并修复播放问题:
private fun initializeExoPlayer(soundFile: String): ExoPlayer { // 替代废弃的ExoPlayerFactory,保留原逻辑的渲染器和轨道选择器配置 val exoPlayer = ExoPlayer.Builder(this) .setRenderersFactory(DefaultRenderersFactory(this)) .setTrackSelector(DefaultTrackSelector()) .build() // 保留自定义DataSourceFactory的逻辑 val dataSourceFactory = DefaultDataSourceFactory( this, Util.getUserAgent(this, getString(R.string.app_name)) ) // 修正assets Uri格式(错误写法:assets:///,正确写法:asset:///) val mediaItem = MediaItem.fromUri(Uri.parse("asset:///$soundFile")) // 适配新版API,用MediaItem创建ProgressiveMediaSource val mediaSource = ProgressiveMediaSource.Factory(dataSourceFactory) .createMediaSource(mediaItem) Log.d("MAIN", "loading $soundFile") // 正确设置媒体源并准备播放 exoPlayer.setMediaSource(mediaSource) exoPlayer.prepare() // 设置无限循环模式 exoPlayer.repeatMode = Player.REPEAT_MODE_ALL return exoPlayer }
关键修复点说明
- 播放器实例化:用
ExoPlayer.Builder替代废弃的ExoPlayerFactory,通过setRenderersFactory和setTrackSelector保留原代码的自定义配置 - 媒体源构建:先将Uri转换为
MediaItem,再传入ProgressiveMediaSource.Factory.createMediaSource(),同时保留原自定义DefaultDataSourceFactory的使用(解决原修改代码中dataSource未被使用的问题) - Uri格式修正:用户修改后的代码错误使用
assets:///作为协议头,正确的assets文件Uri协议为asset:///,这是媒体无法播放的核心原因 - 播放准备逻辑:新版API推荐使用
setMediaSource()设置媒体源后再调用prepare(),确保媒体源正确加载
注意事项
- 确保
soundFile参数为assets目录下的完整文件名(包含后缀,如bgm.mp3) - 若需添加多个媒体项,可调用
addMediaItem(),但单媒体源场景下使用setMediaSource()更符合原逻辑
内容的提问来源于stack exchange,提问作者Sidharth
相关产品推荐
相关产品推荐

