Flutter just_audio调用setAudioSource设置播放列表时应用崩溃求助
问题场景
调用await _player.setAudioSource(_playlist);时应用崩溃,注释该代码则正常启动。使用版本:
just_audio: ^0.9.29 audio_service: ^0.18.7
此前功能正常,突然出现故障。三星设备抛出错误:
E/AndroidRuntime(29193): FATAL EXCEPTION: main
E/AndroidRuntime(29193): Process: com.myapp.music, PID: 29193
E/AndroidRuntime(29193): java.lang.NoSuchMethodError: No virtual
method buildOrThrow()Lcom/google/common/collect/ImmutableMap; in class
Lcom/google/common/collect/ImmutableMap$Builder; or its super classes
(declaration of 'com.google.common.collect.ImmutableMap$Builder'
appears in
/data/app/~~w8o-YhL68Tea9ikpfdER9g==/com.myapp.music-Tng-aVz190Pc8uM2piHH8g==/base.apk!classes21.dex)
E/AndroidRuntime(29193): at
com.google.android.exoplayer2.audio.AudioCapabilities.(AudioCapabilities.java:75)
...(省略后续栈信息)
问题原因
这是Guava依赖版本冲突导致的:just_audio底层依赖的ExoPlayer需要调用Guava新版本中的buildOrThrow()方法,但项目中其他依赖引入了旧版Guava,该方法在旧版中不存在,初始化ExoPlayer时就会抛出NoSuchMethodError。而调用setAudioSource才会触发ExoPlayer初始化,所以注释该代码不会崩溃。
解决步骤
强制指定兼容的Guava版本
在android/build.gradle的allprojects块中添加依赖强制策略:allprojects { repositories { // 保留原有仓库配置 } configurations.all { // 强制使用ExoPlayer兼容的Guava版本 resolutionStrategy.force 'com.google.guava:guava:31.0.1-android' } }清理缓存并重新构建
执行以下命令确保依赖生效:flutter clean rm -rf android/.gradle flutter pub get flutter run可选:升级插件版本
尝试升级just_audio和audio_service到最新稳定版,新版本通常会修复依赖兼容问题:just_audio: ^0.9.36 # 或更高稳定版 audio_service: ^0.18.12 # 或更高稳定版
内容的提问来源于stack exchange,提问作者Sandeep

