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

如何用expo-av在Expo中实现锁屏媒体控制(兼容新架构)

用Expo AV实现锁屏媒体控制(兼容新架构)

一、基于Expo AV的实现方案

Expo AV从SDK 48+开始完全支持React Native新架构,可通过以下步骤实现锁屏媒体控制:

1. 配置项目权限与后台音频

在app.json的expo字段中添加必要配置,确保后台音频和锁屏控制权限生效:

{
  "expo": {
    "ios": {
      "infoPlist": {
        "UIBackgroundModes": ["audio"],
        "NSAppleMusicUsageDescription": "用于在锁屏界面展示媒体控制组件"
      }
    },
    "android": {
      "permissions": ["POST_NOTIFICATIONS"]
    },
    "plugins": [
      [
        "expo-av",
        {
          "audioPermission": "允许应用访问音频以实现后台播放和锁屏控制"
        }
      ]
    ]
  }
}

2. 初始化音频会话

启用外部播放会话(核心配置,用于激活锁屏控制):

import { Audio } from 'expo-av';

async function initAudioSession() {
  await Audio.setAudioModeAsync({
    allowsRecordingIOS: false,
    playsInSilentModeIOS: true,
    shouldDuckAndroid: false,
    usesExternalPlaybackSession: true, // 关键:开启锁屏控制支持
    staysActiveInBackground: true,
  });
}

// 在应用启动时调用
initAudioSession();

3. 更新锁屏曲目元数据

播放新曲目或播放状态变化时,调用setNowPlayingAsync同步元数据到锁屏:

async function updateLockScreen(track, isPlaying) {
  // track 示例:{ title: "夜曲", artist: "周杰伦", coverUri: "https://example.com/cover.jpg" }
  await Audio.setNowPlayingAsync({
    title: track.title,
    artist: track.artist,
    artworkUri: track.coverUri, // 支持HTTPS远程地址或本地文件URI
    isPlaying: isPlaying,
  });
}

// 示例:播放某首歌时调用
const currentTrack = { title: "夜曲", artist: "周杰伦", coverUri: "https://example.com/cover.jpg" };
updateLockScreen(currentTrack, true);

4. 监听锁屏控制指令

通过音频事件监听器响应锁屏的播放/暂停操作:

let playbackListener;
let interruptionListener;

function setupControlListeners(soundObject) {
  // 监听播放状态变化(同步锁屏状态)
  playbackListener = Audio.addAudioEventListener(
    'playbackStateDidChange',
    (status) => {
      if (status.isPlaying !== undefined) {
        updateLockScreen(currentTrack, status.isPlaying);
      }
    }
  );

  // 监听外部中断(如锁屏的播放/暂停指令)
  interruptionListener = Audio.addAudioEventListener(
    'interruption',
    (event) => {
      if (event.type === Audio.InterruptionType.Ended && event.shouldResume) {
        soundObject.playAsync();
      } else if (event.type === Audio.InterruptionType.Began) {
        soundObject.pauseAsync();
      }
    }
  );
}

// 组件卸载时清理监听器
useEffect(() => {
  setupControlListeners(yourSoundObject);
  return () => {
    playbackListener?.remove();
    interruptionListener?.remove();
  };
}, [yourSoundObject]);

二、兼容新架构的替代库

如果需要更复杂的媒体控制(如上一曲/下一曲、进度条),可考虑:

  • expo-av + expo-notifications:结合自定义Android媒体通知(iOS端锁屏控制已由Expo AV原生处理)
  • react-native-media-controller:已适配新架构的第三方库,提供更丰富的锁屏控制组件,需使用Expo预构建或EAS构建确保兼容性

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 15:14:59