使用expo-av在Expo项目中无法播放音频的问题排查
问题分析与修复方案
先梳理你代码里的几个关键错误:
playSound函数缺少async关键字
函数内部使用了await调用异步方法,但定义时未添加async,会直接触发语法错误,导致播放逻辑根本无法执行。useEffect存在语法与冗余问题
useEffect的箭头函数体开头缺失{,且内部重复定义了enableAudio函数,既冗余又可能引发作用域冲突。异步调用未等待执行完成
直接调用enableAudio()和playSound()这两个异步函数,未通过await或.then()处理,可能出现音频模式还未配置完成就尝试播放的情况,导致播放失败。未处理音频资源释放(潜在隐患)
创建的Sound实例若不及时释放,会持续占用系统资源,甚至影响后续音频播放。
修复后的代码示例:
import { Audio } from 'expo-av'; import { useEffect, useState } from 'react'; export default function YourComponent() { const [sound, setSound] = useState(null); // 统一配置音频模式 const enableAudio = async () => { await Audio.setAudioModeAsync({ playsInSilentModeIOS: true, staysActiveInBackground: false, shouldDuckAndroid: false, }); }; // 补全async关键字,确保异步逻辑正常执行 const playSound = async () => { try { await enableAudio(); const { sound: s } = await Audio.Sound.createAsync( require('../../assets/sounds/strongClick.wav') ); setSound(s); await s.playAsync(); // 播放结束后自动释放资源 s.setOnPlaybackStatusUpdate((status) => { if (status.didJustFinish) { s.unloadAsync(); setSound(null); } }); } catch (err) { console.error('音频播放失败:', err); } }; useEffect(() => { playSound(); // 组件卸载时清理音频资源 return () => { sound?.unloadAsync(); }; }, []); return ( // 你的组件内容 <div>...</div> ); }
额外检查项:
- 确认音频文件路径
../../assets/sounds/strongClick.wav正确,文件未损坏且格式为expo-av支持的类型(WAV是支持的)。 - iOS设备需确认系统音量未调至0,即使开启了
playsInSilentModeIOS: true,音量为0也无法发声。 - Android设备可检查app.json中是否配置了音频相关权限(Expo通常会自动处理,但可确认
permissions字段包含AUDIO_RECORDING或PLAY_AUDIO)。
内容的提问来源于stack exchange,提问作者Adrian Bartholomew
相关产品推荐
相关产品推荐

