react-native-sound 的 Sound.setCategory('Ambient') 在 Android 上将音频路由到通知音量流(STREAM_NOTIFICATION),当用户通知音量较低时会导致音频静音。
概述
react-native-sound 提供跨平台音频播放能力,通过 Sound.setCategory() 设置音频类别。但 iOS 和 Android 的音频类别映射存在本质差异:
| Category 参数 | iOS 映射 | Android 映射 |
|---|---|---|
'Ambient' | AVAudioSessionCategoryAmbient ✅ | AudioManager.STREAM_NOTIFICATION ❌ |
'Playback' | AVAudioSessionCategoryPlayback | AudioManager.STREAM_MUSIC ✅ |
iOS 上 'Ambient' 是游戏/App 背景音频的正确选择(跟随静音开关)。但 Android 没有等价概念,STREAM_NOTIFICATION 是完全不同的音频通道,用户通常静音或调低通知音量。
用法
按平台选择 category:
import { Platform } from 'react-native'
import Sound from 'react-native-sound'
// Android 用 Playback(STREAM_MUSIC),iOS 用 Ambient
Sound.setCategory(Platform.OS === 'android' ? 'Playback' : 'Ambient', true)
注意事项
- 此问题不易发现:开发时模拟器通知音量通常是打开的,只在真机上复现
'Playback'在 iOS 上意味着即使静音开关打开也会播放声音,对游戏 App 可能不是期望行为- 如果需要 iOS 上跟随静音开关 + Android 上走媒体音量,必须按平台分别设置
版本说明
本页基于 react-native-sound 0.11.2。Android 实现见 RNSoundModule.java 中 setCategory 方法的 stream type 映射。
参见
- React Native
参考
- SaltyFlame HAT-398 AudioManager 修复(2026-04-28)
- react-native-sound GitHub: https://github.com/zmxv/react-native-sound