You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ExoPlayer开发报错:类型不匹配,替换废弃API后无媒体播放

ExoPlayer类型不匹配错误及播放失败解决方案

问题分析

  1. 类型不匹配错误:使用DefaultDataSource.Factory时直接将Util.getUserAgent返回的字符串作为构造参数,但新版ExoPlayer中DefaultDataSource.Factory的构造函数不接受String类型的用户代理参数,触发Type mismatch: inferred type is String but DataSource.Factory was expected报错。
  2. 替换废弃类后无法播放:一是使用了已废弃的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 14:10:46