0

I'm developing an Xamarin.Forms app, and in iOS I can duck audio by following code:

AVAudioSession.SharedInstance().SetCategory(AVAudioSessionCategory.Playback, AVAudioSessionCategoryOptions.DuckOthers);

What is the equivalent for Android?

Thanks in advance.

crigint
  • 31
  • 5
  • 1
    It is called audio focus on Android – Cheesebaron May 07 '18 at 14:26
  • Hello, what is duck audio? Do you want to play audio on Android? You can check the [MediaPlayer](https://developer.android.com/reference/android/media/MediaPlayer), [here](https://stackoverflow.com/questions/12266502/android-mediaplayer-stop-and-play) is how to use it. – Robbit May 08 '18 at 05:49
  • When my app is playing an audio and an other audio coming from an external app, my app has to reduce the audio volume – crigint May 08 '18 at 05:57

1 Answers1

1

I solved creating a class on Droid project like this:

class NotificationManager
{
    static public Android.Media.AudioManager audioManager = null;
    static Activity mainActivity = null;

    public static Activity MainActivity
    {
        set { mainActivity = value; }
    }

    Android.Media.AudioManager.IOnAudioFocusChangeListener listener = null;

    private class FocusChangeListener : Java.Lang.Object, Android.Media.AudioManager.IOnAudioFocusChangeListener
    {
        public void OnAudioFocusChange(AudioFocus focusChange)
        {
            switch (focusChange)
            {
                // We will take any flavor of AudioFocusgain that the system gives us and use it.
                case AudioFocus.GainTransient:
                case AudioFocus.GainTransientMayDuck:
                    break;
                case AudioFocus.Gain:
                    break;
                // If we get any notificationthat removes focus - just terminate what we were doing.
                case AudioFocus.LossTransientCanDuck:
                    break;
                case AudioFocus.LossTransient:
                case AudioFocus.Loss:
                    break;
                default:
                    break;
            }
        }
    }

    public Boolean RequestAudioResources()
    {
        listener = new FocusChangeListener();

        var ret = audioManager.RequestAudioFocus(listener, Stream.Music, AudioFocus.GainTransientMayDuck);
        if (ret == AudioFocusRequest.Granted)
        {
            return (true);
        }
        else if (ret == AudioFocusRequest.Failed)
        {
            return (false);
        }
        return (false);
    }

    public void ReleaseAudioResources()
    {
        if (listener != null)
            audioManager.AbandonAudioFocus(listener);
    }
}

Then in the MainActivity I set:

NotificationManager.audioManager = (Android.Media.AudioManager)GetSystemService(Context.AudioService);
NotificationManager.MainActivity = this;

At this point I can manage audio by calling RequestAudioResources() and ReleaseAudioResources() methods.

When audio focus is changed, the OnAudioFocusChange() method is called and you can do more stuff.

crigint
  • 31
  • 5