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

使用expo-av在Expo项目中无法播放音频的问题排查

问题分析与修复方案

先梳理你代码里的几个关键错误:

  1. playSound函数缺少async关键字
    函数内部使用了await调用异步方法,但定义时未添加async,会直接触发语法错误,导致播放逻辑根本无法执行。

  2. useEffect存在语法与冗余问题
    useEffect的箭头函数体开头缺失{,且内部重复定义了enableAudio函数,既冗余又可能引发作用域冲突。

  3. 异步调用未等待执行完成
    直接调用enableAudio()和playSound()这两个异步函数,未通过await或.then()处理,可能出现音频模式还未配置完成就尝试播放的情况,导致播放失败。

  4. 未处理音频资源释放(潜在隐患)
    创建的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 00:40:11