Expo Audio staysActiveInBackground属性失效问题咨询
后台流媒体音乐播放停止问题的解决方案
我看你已经尝试设置staysActiveInBackground: true但还是遇到切换应用就停止播放的问题,这几个细节很容易被忽略,咱们来逐个排查:
1. 调整setAudioModeAsync的调用时机
你现在是在调用playAsync()之后才设置音频模式,这时候已经开始播放了,系统可能已经锁定了当前的音频状态,导致后台配置无法生效。一定要在加载/播放音频之前设置音频模式,修改后的代码如下:
const soundObject = new Audio.Sound(); // 确保这个对象是全局/组件级别的,不要放在函数内部 async function playAudio() { try { // 先配置音频模式,放在最前面 await soundObject.setAudioModeAsync({ staysActiveInBackground: true, shouldDuckAndroid: false, // 避免被其他音频压低音量 playThroughEarpieceAndroid: false // 确保用扬声器播放(可选,根据需求调整) }); await soundObject.loadAsync({ uri: "http://suaradio2.dyndns.ws:11004/stream" }); await soundObject.playAsync(); } catch (error) { console.error('播放出错:', error); } }
2. 补充项目的后台权限配置
光代码里设置还不够,需要在项目配置文件中声明后台播放所需的权限,否则系统会阻止应用在后台运行音频:
iOS 配置(app.json/app.config.js)
添加UIBackgroundModes到ios.infoPlist:
{ "expo": { "ios": { "infoPlist": { "UIBackgroundModes": ["audio"] } } } }
Android 配置(app.json/app.config.js)
添加前台服务权限,因为Android要求后台播放的音频必须以前台服务运行:
{ "expo": { "android": { "permissions": ["android.permission.FOREGROUND_SERVICE"], "backgroundPermissions": ["android.permission.FOREGROUND_SERVICE"] } } }
3. 用正式构建包测试
如果你是在Expo Go里测试,后台播放的功能支持并不完善,建议你:
- 运行
expo prebuild生成原生项目文件,然后在Xcode/Android Studio中编译运行 - 或者直接用
expo build:ios/expo build:android生成正式安装包测试,这样权限配置才能完全生效
4. 确保音频对象不被垃圾回收
如果soundObject是在playAudio函数内部创建的,函数执行完后对象可能会被垃圾回收,导致播放中断。一定要把它放在全局作用域或者组件的顶层,保证在应用后台时对象依然存在。
按照这几步调整后,应该就能实现后台持续播放流媒体音乐了。
内容的提问来源于stack exchange,提问作者Maicon Furtado
相关产品推荐
相关产品推荐

