'Android AudioFocus with AudioTrack hardly works

I use AudioTrack to play some audio like GPS navigation does. Of course, I need to ask for an audio focus, but my ugly code doesn't make the trick as I expected. I hear the audioTrack sounds, but I can't say that the music player (another application) reduces it's volume.

AudioTrack:

audioTrack = new AudioTrack.Builder()
    .setAudioAttributes(new AudioAttributes.Builder()
            .setUsage(AudioAttributes.USAGE_MEDIA)
            .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
            .build())
    .setAudioFormat(new AudioFormat.Builder()
            .setChannelMask(AudioFormat.CHANNEL_OUT_MONO)
            .setEncoding(AudioFormat.ENCODING_PCM_16BIT)
            .setSampleRate(SAMPLE_RATE)
            .build())
    .setTransferMode(AudioTrack.MODE_STREAM)
    .setBufferSizeInBytes(intBufferSize)
    .build();

audioTrack.play();

Playback and focus request:

maxVolume = audioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC);

AudioAttributes playbackAttributes = new AudioAttributes.Builder()
    .setUsage(AudioAttributes.USAGE_MEDIA)
    .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
    .build();
AudioFocusRequest focusRequest = new AudioFocusRequest.Builder(AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK)
    .setAudioAttributes(playbackAttributes)
//      .setAcceptsDelayedFocusGain(true)
//      .setOnAudioFocusChangeListener(afChangeListener)
    .build();


int afresult = audioManager.requestAudioFocus(focusRequest);
Log.d(TAG, "Music request focus, result: " + afresult);

if (afresult == AudioManager.AUDIOFOCUS_REQUEST_GRANTED) {
    Log.d(TAG, "Audio Focus is granted ");

    audioTrack.setVolume(maxVolume*0.4f);
    audioTrack.write(myAudioData, 0, myAudioData.length);
}

else if (afresult == AudioManager.AUDIOFOCUS_REQUEST_FAILED){
    Log.d(TAG, "Audio Focus is failed ");
} else if (afresult == AudioManager.AUDIOFOCUS_REQUEST_DELAYED){
    Log.d(TAG, "Audio Focus is delayed ");
}

audioManager.abandonAudioFocusRequest(focusRequest);

I don't have OnAudioFocusChangeListener yet, but I will implement it. So why does it seem like that other applications don't handle audio focus loss? AUDIOFOCUS_GAIN_TRANSIENT works, but AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK doesn't. What am I doing wrong?

Thank you in advance.



Solution 1:[1]

I realized that my code can't be working as I am trying to mute one music stream and play another one. I had to change USAGE and CONTENT_TYPE attributes.

It can be CONTENT_TYPE_SONIFICATION + USAGE_ASSISTANCE_SONIFICATION or CONTENT_TYPE_SPEECH + USAGE_VOICE_COMMUNICATION as it is said in documentation.

Hope, it will help somebody.

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 user12628549