AudioManager不陌生吧,你要设置音量、静音都要用到它,有时会遇到两个应用的音频重叠播放,就是因为没做好处理。。。
一、常用方法
初始化:
AudioManager mAudioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
AudioManager声音的模式(streamType)如下:
AudioManager.STREAM_MUSIC 媒体声音
AudioManager.STREAM_VOICE_CALL 通话声音
AudioManager.STREAM_SYSTEM 系统声音
AudioManager.STREAM_RING 电话铃声
AudioManager.STREAM_ALARM 闹钟声音
AudioManager.STREAM_NOTIFICATION 通知声音
AudioManager.STREAM_BLUETOOTH_SCO 蓝牙链接声音
AudioManager的附加参数flags如下:
AudioManager.FLAG_SHOW_UI 调整时显示音量条(就是按音量键出现的那个)
AudioManager.FLAG_PLAY_SOUND 改变音量时播放声音
AudioManager.FLAG_VIBRATE 手机铃声进入振动铃声模式是否振动
AudioManager.FLAG_ALLOW_RINGER_MODES 更改音量时是否切换模式,比如响铃音量设置为0时是否开启震动模式
AudioManager.FLAG_SHOW_SILENT_HINT 由于静音模式,无法调整音量,请在用户界面中显示提示。
AudioManager.FLAG_ACTIVE_MEDIA_ONLY 指示仅当媒体正在活动播放时才应处理此问题。
AudioManager.FLAG_SHOW_UI_WARNINGS 就像FLAG_SHOW_UI,但是只有对话框警告和确认,没有滑块。
AudioManager.FLAG_SHOW_VIBRATE_HINT 阻止将音量从振动调低,在用户界面中显示提示。
AudioManager的direction解释:
AudioManager.ADJUST_RAISE 增加铃声音量
AudioManager.ADJUST_LOWER 减小铃声音量。
AudioManager.ADJUST_MUTE 静音
AudioManager.ADJUST_UNMUTE 取消静音
1、 音量
1.1、获取当前streamType的音量
getStreamVolume(int streamType);
参数streamType:参考AudioManager的声音模式如:AudioManager.STREAM_MUSIC
1.2、获取当前streamType的最大音量值
getStreamMaxVolume(int streamType);
参数streamType:参考AudioManager的声音模式如:AudioManager.STREAM_MUSIC
1.3、设置当前streamType的音量值
设置方法一、直接设置当前音量值
setStreamVolume(int streamType, int index, int flags);
参数streamType:参考AudioManager的声音模式如:AudioManager.STREAM_MUSIC
参数index:音量值
参数flags:附加参数如AudioManager.FLAG_SHOW_UI (调整时显示音量条(就是按音量键出现的那个))
设置方法二、渐进式设置音量值(类似按物理音量键一步一步到指定值)
adjustStreamVolume(int streamType, int direction, int flags);
参数streamType:参考AudioManager的声音模式如:AudioManager.STREAM_MUSIC
参数direction:参考direction解释:如AudioManager.ADJUST_LOWER
参数flags:附加参数如AudioManager.FLAG_SHOW_UI (调整时显示音量条(就是按音量键出现的那个))
设置方法三、渐进式设置音量值
adjustVolume(int direction, int flags);
参数direction:参考direction解释:如AudioManager.ADJUST_LOWER
参数flags:附加参数如AudioManager.FLAG_SHOW_UI (调整时显示音量条(就是按音量键出现的那个))
2、获取焦点(处理声音重叠问题)
requestAudioFocus(OnAudioFocusChangeListener l, int streamType, int durationHint)
参数l:焦点切换监听
参数streamType:参考AudioManager的streamType模式如:AudioManager.STREAM_MUSIC
参数durationHint:参考如下
durationHint参数:
AudioManager.AUDIOFOCUS_NONE 用于指示未获得或丢失音频焦点或请求音频焦点。
AudioManager.AUDIOFOCUS_GAIN (效果:重叠播放效果)用于指示未知持续时间的音频聚焦增益或音频聚焦请求。
AudioManager.AUDIOFOCUS_GAIN_TRANSIENT (效果:播放时其他暂停,释放后其他继续播放)用于表示暂时获得或请求音频焦点
AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK (效果:类似导航播报,原声音弱化,释放后恢复)用于表示暂时的音频焦点请求,
AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_EXCLUSIVE (效果:播放时其他暂停,释放后其他继续播放)独占和瞬时音频焦点请求的示例是语音备忘录记录和语音识别,在此期间系统不应播放任何通知和媒体播放应该已暂停
AudioManager.AUDIOFOCUS_LOSS (效果:获取焦点失败,没测出效果)用于指示持续时间未知的音频焦点丢失。
AudioManager.AUDIOFOCUS_LOSS_TRANSIENT (效果:获取焦点失败,没测出效果)用于指示音频焦点暂时丢失。
AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK (效果:获取焦点失败,没测出效果)用于指示音频焦点的丢失者可以如果要继续播放(也称为“回避”),请降低输出音量新的焦点所有者不要求其他人保持沉默。
二、代码示例
1、是否有媒体声音在播放(也可以处理声音重叠问题的产生)
/**
* Android中判断是否有音频声音在播放(其他第三方应用)
*
* @return
*/
private boolean isFmActive() {
AudioManager am = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
if (am == null) {
return false;
}
return am.isMusicActive();
}
2、强制获取媒体焦点如:正在播放音乐,导航播报,音乐声音弱化或者直接停止,播报结束释放焦点自动播放原音乐
/**
* 强制获取播放焦点
*/
private void focusRequestAudio() {
mAudioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
if (mAudioManager != null) {
// Request audio focus for playback 结束记得释放abandonAudioFocus
int result = mAudioManager.requestAudioFocus(audioFocusChangeListener,
STREAM_MUSIC,
AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_EXCLUSIVE);
//A successful focus change request.
if (result == AudioManager.AUDIOFOCUS_REQUEST_GRANTED) {
//播放自己的音频
} else {
//A failed focus change request.获取焦点失败
Log.e("snow", "=testDemo==获取焦点失败====");
}
}
}
AudioManager.OnAudioFocusChangeListener audioFocusChangeListener = new AudioManager.OnAudioFocusChangeListener() {
@Override
public void onAudioFocusChange(int focusChange) {//不知为什么只调用了一次
Log.e("snow", "=testDemo==focusChange====" + focusChange);
}
};
@Override
protected void onDestroy() {
super.onDestroy();
//释放声音的焦点
if (mAudioManager != null) {
mAudioManager.abandonAudioFocus(audioFocusChangeListener);
}
}
3、静音模式
/**
* 静音模式
*/
public void silent() {
mAudioManager.setRingerMode(AudioManager.RINGER_MODE_SILENT);
}
4、震动模式
/**
* 震动模式
*/
public void vibrate() {
mAudioManager.setRingerMode(AudioManager.RINGER_MODE_VIBRATE);
}
5、正常模式
/**
* 正常模式
*/
public void normal() {
mAudioManager.setRingerMode(AudioManager.RINGER_MODE_NORMAL);
}
6、获取铃声模式
/**
* 获取铃声模式
*/
public void getRingerMode() {
mAudioManager.getRingerMode();
}
7、获取音频模式
/**
* 获取音频模式
*/
public void getAudioMode() {
mAudioManager.getMode();
}