一、音频焦点(AudioFocus)相关方法
音频焦点的相关方法如下:
-
int requestAudioFocus(AudioFocusRequest focusRequest):请求音频的焦点。
-
int requestAudioFocus(AudioManager.OnAudioFocusChangeListener l,int streamType,int durationHint):请求音频的焦点。
-
int abandonAudioFocus(AudioFocusRequest focusRequest):放弃音频焦点
-
int abandonAudioFocus(AudioManager.OnAudioFocusChangeListenerl):放弃音频的焦点。
其中streamType定义如下:
-
STREAM_ALARM:闹钟
-
STREAM_DTMF:双音多频,拨号键的声音
-
STREAM_MUSIC:音乐
-
STREAM_NOTIFICATION:通知
-
STREAM_RING:铃声
-
STREAM_SYSTEM:系统
-
STREAM_VOICE_CALL:通话
durationHint定义如下:
-
AUDIOFOCUS_GAIN: 此参数表示希望申请一个永久的音频焦点,并且希望上一个持有音频焦点的App停止播放;例如在需要播放音乐时。
-
AUDIOFOCUS_GAIN_TRANSIENT:表示申请一个短暂的音频焦点,并且马上就会被释放,此时希望上一个持有音频焦点的App暂停播放。例如播放一个提醒声音。
-
AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK:效果同AUDIOFOCUS_GAIN_TRANSIENT,只是希望上一个持有焦点的App减小其播放声音(但仍可以播放),此时会混音播放。例如导航播报。
-
AUDIOFOCUS_GAIN_TRANSIENT_EXCLUSIVE: 表示申请一个短暂的音频焦点,并且会希望系统不要播放任何突然的声音(例如通知,提醒等),例如用户在录音。
OnAudioFocusChangeListener定义如下:
-
interface OnAudioFocusChangeListener{void onAudioFocusChange(int focusChange)}:音频焦点变化监听器
二、Domo代码
在请求和放弃音频焦点时需要传递AudioFocusRequest,如下为音频焦点申请/释放的工具类:
import android.content.Context;
import android.media.AudioAttributes;
import android.media.AudioFocusRequest;
import android.media.AudioManager;
import android.os.Build;
public class AudioFocusUtils {
//音频焦点管理
private static AudioManager audioManager;
private static AudioFocusRequest audioFocusRequest;
private static OnAudioFocusListener onAudioFocusListener;
/**
* 初始化音频焦点
*
* @param context 上下文
*/
public static void requestAudioFocus(Context context) {
if (audioManager == null) {
//音频焦点
audioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
//android8.0之后申请焦点方式
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
//AudioAttributes 配置(多媒体场景,申请的是音乐流)
AudioAttributes audioAttributes = new AudioAttributes.Builder()
.setUsage(AudioAttributes.USAGE_MEDIA)
.setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
.build();
// 初始化AudioFocusRequest
audioFocusRequest = new AudioFocusRequest.Builder(AudioManager.AUDIOFOCUS_GAIN)
.setAudioAttributes(audioAttributes)
//设置是否允许延迟获取焦点
.setAcceptsDelayedFocusGain(true)
//设置AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK会暂停,系统不会压低声音
.setWillPauseWhenDucked(true)
//设置焦点监听回调
.setOnAudioFocusChangeListener(onAudioFocusChangeListener)
.build();
//申请焦点
audioManager.requestAudioFocus(audioFocusRequest);
} else {//android8.0之前申请焦点方式
audioManager.requestAudioFocus(onAudioFocusChangeListener, AudioManager.STREAM_MUSIC, AudioManager.AUDIOFOCUS_GAIN);
}
}
}
/**
* 注销音频焦点
*/
public static void releaseAudioFocus() {
if (audioManager != null) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
audioManager.requestAudioFocus(audioFocusRequest);
} else {//android8.0之前申请焦点方式
audioManager.abandonAudioFocus(onAudioFocusChangeListener);
audioManager = null;
}
}
}
/**
* 音频焦点监听
*/
private static AudioManager.OnAudioFocusChangeListener onAudioFocusChangeListener = new AudioManager.OnAudioFocusChangeListener() {
@Override
public void onAudioFocusChange(int focusChange) {
switch (focusChange) {
case AudioManager.AUDIOFOCUS_GAIN:
//获取音频焦点
if (onAudioFocusListener != null) {
onAudioFocusListener.onAudioFocusGain();
}
break;
case AudioManager.AUDIOFOCUS_LOSS:
// 处理丢失焦点的逻辑
if (onAudioFocusListener != null) {
onAudioFocusListener.onAudioFocusLost();
}
break;
case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT:
// 处理短暂丢失焦点的逻辑
if (onAudioFocusListener != null) {
onAudioFocusListener.onAudioFocusLostTransient();
}
break;
case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK:
// 处理短暂丢失焦点并允许降低音量的逻辑
if (onAudioFocusListener != null) {
onAudioFocusListener.onAudioFocusLostTransientCanDuck();
}
break;
default:
break;
}
}
};
public static void setOnAudioFocusListener(OnAudioFocusListener onAudioFocusListener) {
AudioFocusUtils.onAudioFocusListener = onAudioFocusListener;
}
public interface OnAudioFocusListener {
void onAudioFocusGain(); //获取音频焦点
void onAudioFocusLost(); //丢失音频焦点
void onAudioFocusLostTransient(); //短暂丢失音频焦点
void onAudioFocusLostTransientCanDuck(); //短暂丢失焦点并允许降低音量
}
}
在需要使用的地方调用如下方法就可以了,方法都为静态方法,不需要new对象,之间类名.方法名即可。
//申请音频焦点
AudioFocusUtils.requestAudioFocus(this);
//释放音频焦点
AudioFocusUtils.releaseAudioFocus();
//监听音频焦点变化
AudioFocusUtils.setOnAudioFocusListener(new AudioFocusUtils.OnAudioFocusListener() {
@Override
public void onAudioFocusGain() {
Log.d("MusicFocus","onAudioFocusGain");
}
@Override
public void onAudioFocusLost() {
Log.d("MusicFocus","onAudioFocusLost");
}
@Override
public void onAudioFocusLostTransient() {
Log.d("MusicFocus","onAudioFocusLostTransient");
}
@Override
public void onAudioFocusLostTransientCanDuck() {
Log.d("MusicFocus","onAudioFocusLostTransientCanDuck");
}
});