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

Android Jetpack Media3 ExoPlayer播放报错:Source error(错误码2005)求助

解决Media3 ExoPlayer Source Error(错误码2005)方案

错误码2005对应ExoPlayer的SOURCE_ERROR,本质是媒体源加载失败,以下是针对性排查和解决步骤:

1. 确认网络权限配置

远程音频加载必须依赖网络权限,检查AndroidManifest.xml是否添加:

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

Android 10+设备建议保留ACCESS_NETWORK_STATE,用于提前判断网络状态,避免无网场景下触发加载错误。

2. 检查Media3依赖完整性

确保Module级build.gradle引入了完整且版本统一的Media3库:

dependencies {
    // ExoPlayer核心
    implementation "androidx.media3:media3-exoplayer:1.2.1"
    // MP3格式支持
    implementation "androidx.media3:media3-exoplayer-mp3:1.2.1"
    // MediaSession服务支持
    implementation "androidx.media3:media3-session:1.2.1"
    // 可选:OkHttp数据源(解决部分HTTPS证书问题)
    implementation "androidx.media3:media3-datasource-okhttp:1.2.1"
}

所有Media3库版本必须一致,避免版本冲突导致的兼容性问题。

3. 修正MediaSessionService中的ExoPlayer逻辑

在MediaSessionService中,ExoPlayer的生命周期绑定和错误监听是关键,调整初始化与播放逻辑:

private lateinit var exoPlayer: ExoPlayer
private lateinit var mediaSession: MediaSession

override fun onCreate() {
    super.onCreate()
    // 初始化ExoPlayer并绑定音频属性
    exoPlayer = ExoPlayer.Builder(this)
        .setAudioAttributes(AudioAttributes.DEFAULT, true)
        .setHandleAudioBecomingNoisy(true)
        .build()
    // 添加错误监听获取详细信息
    exoPlayer.addListener(object : Player.Listener {
        override fun onPlayerError(error: PlaybackException) {
            super.onPlayerError(error)
            Log.e("ExoPlayerError", "详细错误: ${error.errorCodeName}, 原因: ${error.cause}")
        }
    })
    // 初始化MediaSession并绑定服务
    mediaSession = MediaSession.Builder(this, exoPlayer).build()
    setSessionToken(mediaSession.sessionToken)
}

// 标准化播放流程
fun startPlayback(audioUrl: String) {
    val mediaItem = MediaItem.fromUri(audioUrl)
    exoPlayer.setMediaItem(mediaItem)
    exoPlayer.prepare()
    exoPlayer.play()
}

override fun onDestroy() {
    // 释放资源避免内存泄漏
    mediaSession.release()
    exoPlayer.release()
    super.onDestroy()
}

通过onPlayerError可以获取更具体的错误原因(比如解码器不支持、网络请求超时等)。

4. 处理HTTPS证书问题

如果测试的HTTPS音频URL存在证书信任问题,使用OkHttp作为数据源:

// 初始化OkHttp数据源工厂
val okHttpFactory = OkHttpDataSourceFactory(
    OkHttpClient.Builder().build(),
    Util.getUserAgent(this, "YourAppName")
)
// 绑定到ExoPlayer
val exoPlayer = ExoPlayer.Builder(this)
    .setMediaSourceFactory(DefaultMediaSourceFactory(okHttpFactory))
    .build()

5. 本地音频测试排除核心问题

先播放本地assets中的MP3文件,验证ExoPlayer本身是否正常工作:

val mediaItem = MediaItem.fromUri("asset:///sample.mp3")
exoPlayer.setMediaItem(mediaItem)
exoPlayer.prepare()
exoPlayer.play()

如果本地播放正常,说明问题集中在网络或远程音频源的处理逻辑上。

内容的提问来源于stack exchange,提问作者Kishan Solanki

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 16:32:50