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
相关产品推荐
相关产品推荐

