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

Expo(React Native)应用后台运行时音频控制实现方案咨询

Expo 音乐后台播放及控制能力实现方案

原生支持现状

目前Expo SDK 46及以上版本已经原生支持锁屏、系统通知栏、控制中心的音乐后台控制能力,2017年资料提到的不支持问题早已解决,不需要eject出原生项目即可实现。

基于expo-av的官方实现步骤

你已经配置的staysActiveInBackground: true是后台播放的基础,在此之上补充以下配置和代码即可接入后台控制:

  • 补全音频模式全局配置
import { Audio } from 'expo-av';

await Audio.setAudioModeAsync({
  staysActiveInBackground: true,
  playsInSilentModeIOS: true, // iOS端必配,保证静音开关开启时仍能播放
  shouldDuckAndroid: true,
  allowsRecordingIOS: false,
});
  • 配置app.json的后台权限,不需要修改原生代码:
{
  "expo": {
    "ios": {
      "infoPlist": {
        "UIBackgroundModes": ["audio"]
      }
    },
    "android": {
      "permissions": ["FOREGROUND_SERVICE_MEDIA_PLAYBACK"]
    }
  }
}
  • 加载音频时同步设置媒体元数据,系统会自动将歌曲名、歌手、封面等信息展示在系统控制界面:
const { sound } = await Audio.Sound.createAsync(
  { uri: '你的音频资源地址' },
  { shouldPlay: true },
  playbackStatusUpdateCallback
);

// 设置控制中心展示的媒体信息
await sound.setNowPlayingAsync({
  title: '歌曲标题',
  artist: '歌手名称',
  artwork: '专辑封面URL',
  duration: 音频总时长(毫秒值)
});
  • 注册系统控制事件监听,即可响应后台的播放、暂停、停止、切歌操作:
Audio.addPlaybackListener((event) => {
  switch (event.type) {
    case 'play':
      sound.playAsync();
      break;
    case 'pause':
      sound.pauseAsync();
      break;
    case 'stop':
      sound.stopAsync();
      break;
    case 'nextTrack':
      // 自定义下一首切换逻辑
      break;
    case 'previousTrack':
      // 自定义上一首切换逻辑
      break;
  }
});

以上配置在Expo Go调试环境、正式生产包中均可正常生效。

进阶可选方案

如果你需要更复杂的后台控制能力,比如自定义通知栏按钮、缓存策略、长音频/播客场景的稳定性优化,可以选择以下不需要eject的方案:

  • 基于expo-notifications自定义媒体样式通知,自行绑定通知按钮点击事件触发播放控制,灵活度最高
  • 接入带Expo插件支持的react-native-track-player,该库专门针对音乐播放场景做了优化,后台控制、音频焦点管理、车载系统适配的成熟度高于expo-av,安装时配置对应插件即可直接使用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 03:12:18