[android] Do not stop music when announcing directions

Also added a proper audio attributes and fixed focus release.

Signed-off-by: Alexander Borsuk <me@alex.bio>
This commit is contained in:
Alexander Borsuk 2021-12-24 23:49:22 +01:00 committed by Alexander Borsuk
parent c6499fd147
commit 07fe2ec5ac

View file

@ -1,38 +1,51 @@
package com.mapswithme.maps.sound;
import android.content.Context;
import android.media.AudioAttributes;
import android.media.AudioFocusRequest;
import android.media.AudioManager;
import android.os.Build;
import androidx.annotation.Nullable;
import static android.media.AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_EXCLUSIVE;
import static android.media.AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK;
public class AudioFocusManager
{
@Nullable
private AudioManager audioManager = null;
private AudioManager mAudioManager = null;
@Nullable
private AudioManager.OnAudioFocusChangeListener mOnFocusChange = null;
@Nullable
private AudioFocusRequest mAudioFocusRequest = null;
public AudioFocusManager(@Nullable Context context)
{
if (context != null)
audioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
mAudioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
if (Build.VERSION.SDK_INT < 26)
mOnFocusChange = focusGain -> {};
else
mAudioFocusRequest = new AudioFocusRequest.Builder(AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK).setAudioAttributes(
new AudioAttributes.Builder()
.setUsage(AudioAttributes.USAGE_ASSISTANCE_NAVIGATION_GUIDANCE)
.setContentType(AudioAttributes.CONTENT_TYPE_SPEECH)
.build()
).build();
}
public boolean requestAudioFocus()
{
boolean isMusicActive = false;
if (audioManager != null)
isMusicActive = audioManager.isMusicActive();
if (audioManager != null)
if (mAudioManager != null)
{
if (Build.VERSION.SDK_INT >= 26)
audioManager.requestAudioFocus(new AudioFocusRequest.Builder(AUDIOFOCUS_GAIN_TRANSIENT_EXCLUSIVE).build());
isMusicActive = mAudioManager.isMusicActive();
if (Build.VERSION.SDK_INT < 26)
mAudioManager.requestAudioFocus(mOnFocusChange, AudioManager.STREAM_VOICE_CALL, AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK);
else
audioManager.requestAudioFocus(focusChange -> {}, AudioManager.STREAM_VOICE_CALL, AUDIOFOCUS_GAIN_TRANSIENT_EXCLUSIVE);
mAudioManager.requestAudioFocus(mAudioFocusRequest);
}
return isMusicActive;
@ -40,12 +53,12 @@ public class AudioFocusManager
public void releaseAudioFocus()
{
if (audioManager != null)
if (mAudioManager != null)
{
if (Build.VERSION.SDK_INT >= 26 )
audioManager.abandonAudioFocusRequest(new AudioFocusRequest.Builder(AUDIOFOCUS_GAIN_TRANSIENT_EXCLUSIVE).build());
if (Build.VERSION.SDK_INT < 26)
mAudioManager.abandonAudioFocus(mOnFocusChange);
else
audioManager.abandonAudioFocus(focusChange -> {});
mAudioManager.abandonAudioFocusRequest(mAudioFocusRequest);
}
}
}