// initializing variables for audio focus and playback managementaudioManager=getSystemService(Context.AUDIO_SERVICE)asAudioManagerfocusRequest=AudioFocusRequest.Builder(AudioManager.AUDIOFOCUS_GAIN).run{setAudioAttributes(AudioAttributes.Builder().run{setUsage(AudioAttributes.USAGE_GAME)setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)build()setAcceptsDelayedFocusGain(true)setOnAudioFocusChangeListener(afChangeListener,handler)build()valfocusLock=Any()varplaybackDelayed=falsevarplaybackNowAuthorized=false// requesting audio focus and processing the responsevalres=audioManager.requestAudioFocus(focusRequest)synchronized(focusLock){playbackNowAuthorized=when(res){AudioManager.AUDIOFOCUS_REQUEST_FAILED->falseAudioManager.AUDIOFOCUS_REQUEST_GRANTED->{playbackNow()AudioManager.AUDIOFOCUS_REQUEST_DELAYED->{playbackDelayed=truefalseelse->false// implementing OnAudioFocusChangeListener to react to focus changesoverridefunonAudioFocusChange(focusChange:Int){when(focusChange){AudioManager.AUDIOFOCUS_GAIN->
if(playbackDelayed||resumeOnFocusGain){synchronized(focusLock){playbackDelayed=falseresumeOnFocusGain=falseplaybackNow()AudioManager.AUDIOFOCUS_LOSS->{synchronized(focusLock){resumeOnFocusGain=falseplaybackDelayed=falsepausePlayback()AudioManager.AUDIOFOCUS_LOSS_TRANSIENT->{synchronized(focusLock){// only resume if playback is being interruptedresumeOnFocusGain=isPlaying()playbackDelayed=falsepausePlayback()AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK->{// ... pausing or ducking depends on your app
// initializing variables for audio focus and playback managementaudioManager=(AudioManager)Context.getSystemService(Context.AUDIO_SERVICE);playbackAttributes=newAudioAttributes.Builder().setUsage(AudioAttributes.USAGE_GAME).setContentType(AudioAttributes.CONTENT_TYPE_MUSIC).build();focusRequest=newAudioFocusRequest.Builder(AudioManager
.AUDIOFOCUS_GAIN).setAudioAttributes(playbackAttributes).setAcceptsDelayedFocusGain(true).setOnAudioFocusChangeListener(afChangeListener,handler).build();finalObjectfocusLock=newObject();booleanplaybackDelayed=false;booleanplaybackNowAuthorized=false;// requesting audio focus and processing the responseintres=audioManager.requestAudioFocus(focusRequest);synchronized(focusLock){if(res==AudioManager.AUDIOFOCUS_REQUEST_FAILED){playbackNowAuthorized=false;}elseif(res==AudioManager.AUDIOFOCUS_REQUEST_GRANTED){playbackNowAuthorized=true;playbackNow();}elseif(res==AudioManager.AUDIOFOCUS_REQUEST_DELAYED){playbackDelayed=true;playbackNowAuthorized=false;// implementing OnAudioFocusChangeListener to react to focus changes@OverridepublicvoidonAudioFocusChange(intfocusChange){switch(focusChange){caseAudioManager.AUDIOFOCUS_GAIN:if(playbackDelayed||resumeOnFocusGain){synchronized(focusLock){playbackDelayed=false;resumeOnFocusGain=false;playbackNow();break;caseAudioManager.AUDIOFOCUS_LOSS:synchronized(focusLock){resumeOnFocusGain=false;playbackDelayed=false;pausePlayback();break;caseAudioManager.AUDIOFOCUS_LOSS_TRANSIENT:synchronized(focusLock){// only resume if playback is being interruptedresumeOnFocusGain=isPlaying();playbackDelayed=false;pausePlayback();break;caseAudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK:// ... pausing or ducking depends on your appbreak;
audioManager=getSystemService(Context.AUDIO_SERVICE)asAudioManagerlateinitvarafChangeListenerAudioManager.OnAudioFocusChangeListener// Request audio focus for playbackvalresult:Int=
audioManager.requestAudioFocus(afChangeListener,// Use the music stream.AudioManager.STREAM_MUSIC,// Request permanent focus.AudioManager.AUDIOFOCUS_GAINif(result==AudioManager.AUDIOFOCUS_REQUEST_GRANTED){// Start playback
AudioManageraudioManager=(AudioManager)context.getSystemService(Context.AUDIO_SERVICE);AudioManager.OnAudioFocusChangeListenerafChangeListener;// Request audio focus for playbackintresult=audioManager.requestAudioFocus(afChangeListener,// Use the music stream.AudioManager.STREAM_MUSIC,// Request permanent focus.AudioManager.AUDIOFOCUS_GAIN);if(result==AudioManager.AUDIOFOCUS_REQUEST_GRANTED){// Start playback
privatevalhandler=Handler()privatevalafChangeListener=AudioManager.OnAudioFocusChangeListener{focusChange->
when(focusChange){AudioManager.AUDIOFOCUS_LOSS->{// Permanent loss of audio focus// Pause playback immediatelymediaController.transportControls.pause()// Wait 30 seconds before stopping playbackhandler.postDelayed(delayedStopRunnable,TimeUnit.SECONDS.toMillis(30))AudioManager.AUDIOFOCUS_LOSS_TRANSIENT->{// Pause playbackAudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK->{// Lower the volume, keep playingAudioManager.AUDIOFOCUS_GAIN->{// Your app has been granted audio focus again// Raise volume to normal, restart playback if necessary
privateHandlerhandler=newHandler();AudioManager.OnAudioFocusChangeListenerafChangeListener=newAudioManager.OnAudioFocusChangeListener(){publicvoidonAudioFocusChange(intfocusChange){if(focusChange==AudioManager.AUDIOFOCUS_LOSS){// Permanent loss of audio focus// Pause playback immediatelymediaController.getTransportControls().pause();// Wait 30 seconds before stopping playbackhandler.postDelayed(delayedStopRunnable,TimeUnit.SECONDS.toMillis(30));elseif(focusChange==AudioManager.AUDIOFOCUS_LOSS_TRANSIENT){// Pause playback}elseif(focusChange==AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK){// Lower the volume, keep playing}elseif(focusChange==AudioManager.AUDIOFOCUS_GAIN){// Your app has been granted audio focus again// Raise volume to normal, restart playback if necessary