Android音视频知识之AudioManager类
前言
AudioManager类位于android.media包中,是一个功能强大的音频管理类,它提供了丰富的API来允许开发者对应用的音量和铃声模式进行控制以及访问。
AudioManager provides access to volume and ringer mode control.
获取实例
要使用AudioManager类,首先需要获取一个AudioManager实例,如下所示:
AudioManager audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
然后我们就可以使用AudioManager实例来调用它提供的各种方法
主要功能和方法
设置和获取音频模式
setMode(int mode),设置音频模式getMode(),获取系统当前音频模式
音频模式的取值如下:
| 常量 | 值 | 说明 |
|---|---|---|
MODE_NORMAL |
0 | 正常音频模式 |
MODE_RINGTONE |
1 | 铃声模式 |
MODE_IN_CALL |
2 | 呼叫模式 |
MODE_IN_COMMUNICATION |
3 | 通话模式 |
MODE_CALL_SCREENING |
4 | 呼叫锁屏模式 |
MODE_CALL_REDIRECT |
5 | 呼叫重定向模式 |
MODE_COMMUNICATION_REDIRECT |
6 | 通话重定向模式 |
设置和获取铃声模式
setRingerMode(int ringerMode),设置铃声模式getRingerMode(),获取系统当前铃声模式
铃声模式的取值如下:
//静音模式
public static final int RINGER_MODE_SILENT = 0;
//振动模式
public static final int RINGER_MODE_VIBRATE = 1;
//响铃模式
public static final int RINGER_MODE_NORMAL = 2;
输入/输出设备相关
getDevices(int flags),获取指定的设备列表
//获取输入设备列表
AudioDeviceInfo[] deviceInfoList = audioManager.getDevices(AudioManager.GET_DEVICES_INPUTS);
//获取输出设备列表
AudioDeviceInfo[] deviceInfoList = audioManager.getDevices(AudioManager.GET_DEVICES_OUTPUTS);
//获取输入和输出设备列表
AudioDeviceInfo[] deviceInfoList = audioManager.getDevices(AudioManager.GET_DEVICES_ALL);
setMicrophoneMute(boolean on),打开或关闭麦克风isMicrophoneMute(),获取麦克风是否静音setSpeakerphoneOn(boolean on),打开或关闭扬声器isSpeakerphoneOn(),获取扬声器是否打开startBluetoothSco(),开启蓝牙SCO连接,此方法可用于应用程序想要发送和接收音频到/从蓝牙SCO耳机stopBluetoothSco(),停止蓝牙SCO连接isBluetoothScoOn(),检查系统当前是否使用蓝牙SCO连接
音频焦点处理
请求音频焦点
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
AudioFocusRequest focusRequest = new AudioFocusRequest.Builder(AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_EXCLUSIVE)
.setAudioAttributes(new AudioAttributes.Builder()
.setUsage(AudioAttributes.USAGE_NOTIFICATION_RINGTONE)
.setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
.build())
.setAcceptsDelayedFocusGain(true) //支持延迟获取焦点
.build();
int result = audioManager.requestAudioFocus(focusRequest);
if (result == AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_EXCLUSIVE) {
// 获取焦点成功,开始播放铃声
} else {
// 处理获取失败(如延迟获得焦点)
}
} else {
//兼容旧版本(API <26)的请求方式
audioManager.requestAudioFocus(focusChangeListener, AudioManager.STREAM_RING, AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_EXCLUSIVE);
}
焦点类型选择:
-
AUDIOFOCUS_GAIN_TRANSIENT_EXCLUSIVE:短暂独占焦点(适用于来电铃声,不允许其他应用播放)。
-
AUDIOFOCUS_GAIN:长期焦点(如音乐播放)。
-
AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK:允许其他应用降低音量继续播放。
处理音频焦点变化
实现OnAudioFocusChangeListener以响应焦点变化:
AudioManager.OnAudioFocusChangeListener focusChangeListener = focusChange -> {
switch (focusChange) {
case AudioManager.AUDIOFOCUS_LOSS:
// 永久失去焦点,停止播放并释放资源
break;
case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT:
case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK:
// 暂时失去焦点:暂停播放(对于铃声通常选择暂停而非Ducking)
break;
case AudioManager.AUDIOFOCUS_GAIN:
// 重新获得焦点:恢复播放
break;
}
};
释放音频焦点
private void releaseAudioFocus() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
audioManager.abandonAudioFocusRequest(focusRequest);
} else {
audioManager.abandonAudioFocus(focusChangeListener);
}
}

浙公网安备 33010602011771号