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

