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

ExoPlayer技术问题:player.prepare()方法无法调用求解决方案

解决新版本ExoPlayer中prepare(MediaSource)不可用的问题

嘿,我帮你排查了下这个问题——这是因为你用的是ExoPlayer的新版本,旧的API已经被官方废弃啦!从2.16.0版本开始,ExoPlayer做了大量API迭代,包括你用到的ExoPlayerFactory、ExtractorMediaSource以及带参数的prepare(MediaSource)方法都已经被淘汰,下面是针对你的代码的修复方案:

核心改动点

  • 用ExoPlayer.Builder替代ExoPlayerFactory.newSimpleInstance()创建播放器实例
  • 用ProgressiveMediaSource替代ExtractorMediaSource构建媒体源
  • 新版本需先调用player.setMediaSource(mediaSource),再调用无参的player.prepare(),不再支持直接传入MediaSource的prepare方式

修复后的完整代码

private fun getPlayerStart(urlLink: String) {
    if (playerMode) {
        val userAgent = Util.getUserAgent(context, context?.applicationInfo?.packageName ?: "")
        // 新版本推荐用DefaultHttpDataSource.Factory构建数据源工厂
        val httpDataSourceFactory = DefaultHttpDataSource.Factory()
            .setUserAgent(userAgent)
            .setConnectTimeoutMs(DefaultHttpDataSource.DEFAULT_CONNECT_TIMEOUT_MILLIS)
            .setReadTimeoutMs(DefaultHttpDataSource.DEFAULT_READ_TIMEOUT_MILLIS)
            .setAllowCrossProtocolRedirects(true)
        
        val dataSourceFactory = DefaultDataSource.Factory(context, httpDataSourceFactory)
        Log.i("Video", urlLink)
        val daUri = Uri.parse(urlLink)
        
        // 用ProgressiveMediaSource替代旧的ExtractorMediaSource
        mVideoSource = ProgressiveMediaSource.Factory(dataSourceFactory)
            .createMediaSource(MediaItem.fromUri(daUri))
    }
    initExoPlayer()
}

private fun initExoPlayer() {
    // 用ExoPlayer.Builder创建播放器实例,替代废弃的ExoPlayerFactory
    val player = ExoPlayer.Builder(context!!)
        .setTrackSelector(DefaultTrackSelector(context!!))
        .setLoadControl(DefaultLoadControl())
        .build()
    
    // 关联播放器视图(如果你的项目还在用旧的ExoPlayerView,建议升级为PlayerView)
    mExoPlayerView!!.player = player
    player.addListener(this)
    
    // 新版本的媒体加载流程:先设置媒体源,再调用无参prepare
    mVideoSource?.let {
        player.setMediaSource(it)
        player.prepare()
    }
    player.playWhenReady = true
}

额外注意事项

  • 建议把旧的ExoPlayerView升级为PlayerView(属于com.google.android.exoplayer2.ui包),这是新版本官方推荐的视图组件
  • 确保你的项目依赖最新稳定版的ExoPlayer,比如在build.gradle中配置:
implementation "com.google.android.exoplayer:exoplayer-core:2.19.1"
implementation "com.google.android.exoplayer:exoplayer-ui:2.19.1"
  • 加强空安全处理,比如对context的非空判断,避免出现空指针异常

内容的提问来源于stack exchange,提问作者Prince Kumar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 09:50:55