ExoPlayer开发报错:类型不匹配,替换废弃API后无媒体播放
ExoPlayer类型不匹配错误及播放失败解决方案
问题分析
- 类型不匹配错误:使用
DefaultDataSource.Factory时直接将Util.getUserAgent返回的字符串作为构造参数,但新版ExoPlayer中DefaultDataSource.Factory的构造函数不接受String类型的用户代理参数,触发Type mismatch: inferred type is String but DataSource.Factory was expected报错。 - 替换废弃类后无法播放:一是使用了已废弃的
DefaultDataSourceFactory,二是代码中注释掉了exoPlayer.prepare(mediaSource),仅调用无参prepare(),导致播放器未加载指定媒体资源。
修复代码
正确实现方式如下:
private fun initializeExoPlayer(soundFile: String): ExoPlayer { // 创建播放器实例 val trackSelector = DefaultTrackSelector(this) val exoPlayer = ExoPlayer.Builder(this) .setTrackSelector(trackSelector) .build() // 正确创建DataSource工厂并设置用户代理 val dataSourceFactory = DefaultDataSource.Factory(this) .setUserAgent(Util.getUserAgent(this, getString(R.string.app_name))) // 创建媒体源 val mediaItem = MediaItem.fromUri(Uri.parse("asset:///$soundFile")) val mediaSource = ProgressiveMediaSource.Factory(dataSourceFactory) .createMediaSource(mediaItem) // 加载并准备媒体 Log.d("MAIN", "loading $soundFile") exoPlayer.prepare(mediaSource) // 设置无限循环 exoPlayer.repeatMode = Player.REPEAT_MODE_ALL return exoPlayer }
关键修复点
- DataSource工厂创建:新版
DefaultDataSource.Factory构造仅需传入Context,用户代理通过setUserAgent()方法配置,避免类型不匹配。 - 媒体源加载:必须调用带参数的
prepare(mediaSource),否则播放器无法获取目标媒体资源,导致播放失败。
内容的提问来源于stack exchange,提问作者Sidharth
相关产品推荐
相关产品推荐

