Unity3D - Audio playing getting muted after getting any call/notification on Android

若如初见. 提交于 2019-12-01 19:50:56

This is definitely a bug in Unity. I bumped into the same problem and ran some tests to try to fix it but there is no way to recover the audio without restarting the app.

In my tests I used Google Hangouts notifications to kill the audio.

Programmer's proposed fix won't work because: 1. The notification does not trigger application pause nor application focus events. 2. Initializing a new AudioListener and/or AudioSource instances will not recover the audio either.

This is a low level bug in Unity. I will make a report on the bug.

On iOS everything works perfectly.

Android != iOS.

Use OnApplicationPause(bool pauseStatus) to detect when the Application is paused and resumed. The pauseStatus variable will return true when the app is paused, and false when the app is resumed. So, manually pause the the music when pauseStatus is true and resume the music when pauseStatus is false.

public AudioClip clip;
private AudioSource _musicAudioSource;
bool _musicAudioSourcePaused = false;

void Awake()
{
    if (_musicAudioSource == null)
    {
        _musicAudioSource = gameObject.AddComponent<AudioSource>();
        _musicAudioSource.loop = true;
        _musicAudioSource.clip = clip;
    }

    //Check if Audio is playing. Don't play if already playing. 
    if (!_musicAudioSource.isPlaying)
    {
        _musicAudioSource.Play();
    }
}

void OnApplicationPause(bool pauseStatus)
{
    //Check if this is Pause
    if (pauseStatus)
    {
        //Pause Audio if it is playing
        if (_musicAudioSource.isPlaying)
        {
            _musicAudioSource.Pause();

            //Set to true so that we will detamine whether to Play() or UnPause() the music next time
            _musicAudioSourcePaused = true;
        }
    }

    //Check if this is Resume
    if (!pauseStatus)
    {
        //Make sure audio is not null. If null, getComponent again
        if (_musicAudioSource == null)
        {
            _musicAudioSource = gameObject.AddComponent<AudioSource>();
            _musicAudioSource.loop = true;
            _musicAudioSource.clip = clip;
        }

        //Check if we paused the audio then resume
        if (_musicAudioSourcePaused)
        {
            _musicAudioSource.UnPause();

            //Set to false so that we will detamine whether to Play() or UnPause() the music next time
            _musicAudioSourcePaused = false;
        }

        //Check if Audio is playing. Don't play if already playing. 
        if (!_musicAudioSource.isPlaying)
        {
            _musicAudioSource.Play();
        }
    }
}
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!