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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:19:01