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

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");
    }
}
  • 配置校验
    1. 打开Unity Player Settings > Android > Resolution and Presentation,确认Run In Background选项处于未勾选状态
    2. 检查安卓打包的AndroidManifest.xml,确认没有申请android.permission.FOREGROUND_SERVICE_MEDIA_PLAYBACK等后台音频播放权限(如有后台播放需求可保留)

内容的提问来源于stack exchange,提问作者Farrukh Sajjad

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 04:24:07