Unity关卡制手游部分安卓设备后台仍播放背景音乐问题求助
问题根因
当前AudioManager未监听应用前后台切换的生命周期事件,不同安卓厂商对应用后台音频播放的权限管控逻辑存在差异,部分机型不会主动暂停后台非音乐类应用的音频输出,因此仅少数设备复现该问题。
修复方案
- 代码调整
在AudioManager中补充Unity自带的生命周期回调方法,处理切后台时的音频暂停、切回前台时的状态恢复逻辑,完整修改后代码如下:
public class AudioManager : MonoBehaviour { public static AudioManager Instance; private SoundyManager soundyManager; private AudioSource backGroundSound; // 存储切后台前的音频状态,用于切回时恢复 private bool _lastSoundActiveState; private bool _lastBgmPlayingState; private void Start() { Instance = this; soundyManager = FindObjectOfType<SoundyManager>(true); backGroundSound = BackgroundAudioController.Instance.GetComponent<AudioSource>(); if (!PlayerPrefs.HasKey(PlayerPrefsManager.SoundAudioPref)) { PlayerPrefs.SetString(PlayerPrefsManager.SoundAudioPref, "ON"); } if (!PlayerPrefs.HasKey(PlayerPrefsManager.BackgroundMusicPref)) { PlayerPrefs.SetString(PlayerPrefsManager.BackgroundMusicPref, "ON"); } if (PlayerPrefs.GetString(PlayerPrefsManager.SoundAudioPref) == "OFF") { soundyManager.gameObject.SetActive(false); } if (PlayerPrefs.GetString(PlayerPrefsManager.BackgroundMusicPref) == "OFF") { backGroundSound.Stop(); } } // 应用暂停/切后台时触发 private void OnApplicationPause(bool isPaused) { if (isPaused) { // 记录当前状态后暂停所有音频 _lastSoundActiveState = soundyManager.gameObject.activeSelf; _lastBgmPlayingState = backGroundSound.isPlaying; soundyManager.gameObject.SetActive(false); if(backGroundSound.isPlaying) backGroundSound.Pause(); } else { // 切回前台后按原有状态恢复 if (_lastSoundActiveState && PlayerPrefs.GetString(PlayerPrefsManager.SoundAudioPref) == "ON") { soundyManager.gameObject.SetActive(true); } if (_lastBgmPlayingState && PlayerPrefs.GetString(PlayerPrefsManager.BackgroundMusicPref) == "ON") { backGroundSound.UnPause(); } } } // 应用焦点丢失/获取时触发,覆盖部分安卓设备特殊场景 private void OnApplicationFocus(bool hasFocus) { if (!hasFocus) { _lastSoundActiveState = soundyManager.gameObject.activeSelf; _lastBgmPlayingState = backGroundSound.isPlaying; soundyManager.gameObject.SetActive(false); if(backGroundSound.isPlaying) backGroundSound.Pause(); } else { if (_lastSoundActiveState && PlayerPrefs.GetString(PlayerPrefsManager.SoundAudioPref) == "ON") { soundyManager.gameObject.SetActive(true); } if (_lastBgmPlayingState && PlayerPrefs.GetString(PlayerPrefsManager.BackgroundMusicPref) == "ON") { backGroundSound.UnPause(); } } } public void MuteAllSounds() { soundyManager.gameObject.SetActive(false); PlayerPrefs.SetString(PlayerPrefsManager.SoundAudioPref, "OFF"); } public void UnMuteAllSounds() { soundyManager.gameObject.SetActive(true); PlayerPrefs.SetString(PlayerPrefsManager.SoundAudioPref, "ON"); } public void MuteBackgroundSound() { backGroundSound.Stop(); PlayerPrefs.SetString(PlayerPrefsManager.BackgroundMusicPref, "OFF"); } public void UnMuteBackgroundSound() { backGroundSound.Play(); PlayerPrefs.SetString(PlayerPrefsManager.BackgroundMusicPref, "ON"); } }
- 配置校验
- 打开Unity Player Settings > Android > Resolution and Presentation,确认Run In Background选项处于未勾选状态
- 检查安卓打包的AndroidManifest.xml,确认没有申请
android.permission.FOREGROUND_SERVICE_MEDIA_PLAYBACK等后台音频播放权限(如有后台播放需求可保留)
内容的提问来源于stack exchange,提问作者Farrukh Sajjad
相关产品推荐
相关产品推荐

