一、AudioManager类介绍
二、AudioManager方法简介
三、AudioManager常用方法
四、申请音频焦点
五、第三方音频同步思路处理
1.AudioManager类提供了音量控制与铃声模式相关操作。
2.实例化:AudioManager am = (AudioManager)context.getSystemService(Context.AUDIO_SERVICE);
Public Methods |
|||||||||||
申请焦点 | |||||||||||
int |
requestAudioFocus(AudioManager.OnAudioFocusChangeListener l,int streamType,int durationHint) 请求音频的焦点。 |
||||||||||
int |
abandonAudioFocus(AudioManager.OnAudioFocusChangeListenerl) 放弃音频的焦点。 |
||||||||||
设置与得到 | |||||||||||
void |
setMode(int mode) 设置声音模式。 |
||||||||||
int |
getMode() 返回当前音频模式。 |
||||||||||
void |
setRingerMode(int ringerMode) 设置手机电话铃声的模式。 |
||||||||||
int |
getRingerMode() 返回当前的铃声模式。 |
||||||||||
void |
setParameters(String keyValuePairs) 设置一个音频硬件数量可变的参数值。 |
||||||||||
String |
getParameters(String keys) 给音频硬件设置一个varaible数量的参数值 |
||||||||||
void |
setVibrateSetting (int vibrateType, int vibrateSetting) 设置设置时应该振动的振动类型。 |
||||||||||
int |
getVibrateSetting(int vibrateType) 返回是否该用户的振动设置为振动类型。 |
||||||||||
音量相关: | |||||||||||
int |
getStreamMaxVolume(int streamType) 返回特定流的最大音量指数。 |
||||||||||
void |
adjustVolume(int,intflags) 调整最相关的数据流的音量。 |
||||||||||
void |
adjustStreamVolume(int streamType, int direction, int flags) 调整手机指定类型的声音。 |
||||||||||
int |
getStreamVolume(int streamType) 返回特定数据流的当前音量索引。 |
||||||||||
void |
setStreamMute(int streamType,booleanstate) 将手机的指定类型的声音调整为静音。 |
||||||||||
void |
setStreamVolume (int streamType, int index, int flags) 直接设置手机的指定类型的音量值。 |
||||||||||
void |
setSpeakerphoneOn(boolean on) 设置扬声器打开或关闭。 |
||||||||||
boolean |
isSpeakerphoneOn() 检查是否打开或关闭扬声器。 |
||||||||||
void |
setMicrophoneMute(boolean on) 设置是否让麦克风静音。 |
||||||||||
boolean |
isMicrophoneMute() 检查是否打开或关闭麦克风静音。 |
||||||||||
boolean |
isMusicActive() 检查是否有音乐处于活跃状态。 |
||||||||||
boolean |
isWiredHeadsetOn() 检查是否插入耳机 |
||||||||||
蓝牙相关 | |||||||||||
void |
startBluetoothSco() 启动蓝牙SCO音频连接。 |
||||||||||
void |
stopBluetoothSco() 停止蓝牙SCO音频连接。 |
||||||||||
boolean |
isBluetoothA2dpOn() 检查是否A2DP蓝牙耳机音频路由是打开或关闭。 |
||||||||||
boolean |
isBluetoothScoAvailableOffCall() 显示当前平台是否支持使用SCO的关闭调用用例。 |
||||||||||
boolean |
isBluetoothScoOn() 检查通信是否使用蓝牙SCO。 |
||||||||||
void |
setBluetoothA2dpOn(boolean on) 这个方法是不赞成的。不要使用。 |
||||||||||
void |
setBluetoothScoOn(boolean on) 要求使用蓝牙SCO耳机进行通讯。 |
||||||||||
音效相关 | |||||||||||
void |
loadSoundEffects() 加载声音效果。 |
||||||||||
void |
unloadSoundEffects() 卸载音效。 |
||||||||||
void |
playSoundEffect((int effectType, float volume) 播放声音效果(按键点击,盖开启/关闭...) |
||||||||||
void |
playSoundEffect(int effectType) 播放声音效果(按键点击,盖开启/关闭...) |
||||||||||
不常用方法 | |||||||||||
void |
registerMediaButtonEventReceiver(ComponentName eventReceiver) 注册一个组件MEDIA_BUTTON意图的唯一接收机。 |
||||||||||
void |
unregisterMediaButtonEventReceiver(ComponentName eventReceiver) 注销MEDIA_BUTTON意图的接收机。 |
||||||||||
void |
setWiredHeadsetOn(boolean on) 这个方法是不赞成的。不要使用。 |
||||||||||
boolean |
shouldVibrate(int vibrateType) 返回特定类型是否应该根据用户震动设置和当前的振铃器 mode。 |
||||||||||
int |
getRouting(int mode) 这个方法是不赞成的。不直接查询音频路由,使用isSpeakerphoneOn(), isBluetoothA2dpOn isBluetoothScoOn(),()和isWiredHeadsetOn()方法。 |
||||||||||
void |
setRouting(int mode, int routes, int mask) 这个方法是不赞成的。不设置音频路由直接使用setSpeakerphoneOn(), setBluetoothScoOn()方法。 |
||||||||||
void |
setStreamSolo(int streamType,boolean state) 独奏或来取消特定流。 |
||||||||||
void |
adjustSuggestedStreamVolume(int,int suggestedStreamType intflags) 调整最相关的流的音量,或者给定的回退流。 |
1.调整手机指定类型的声音大小。
void adjustStreamVolume(int streamType,int direction, int flags)
第一个参数streamType指定声音类型
第二个参数指定对声音进行增大、还是减小;
第三个参数是调整声音时的标志,例如指定FLAG_SHOW_UI,则指定调整声音时显示音量进度条。
(1).StreamType类型:
AudioManager.STREAM_ALARM : 手机闹钟
AudioManager.STREAM_RING : 电话铃声
AudioManager.STREAM_MUSIC : 手机音乐
AudioManager.STREAM_SYSTEM : 手机系统
AudioManager.STREAM_DTMF : 音调
AudioManager.STREAM_NOTIFICATION : 系统提示
AudioManager.STREAM_VOICE_CALL : 语音电话
(2).Direction类型
AudioManager.ADJUST_LOWER(降低)
AudioManager.ADJUST_RAISE(升高)
AudioManager.ADJUST_SAME(维持原来的)
(3).Flag类型:
AudioManager.FLAG_SHOW_UI 会弹出调节音量的界面
AudioManager.FLAG_ALLOW_RINGER_MODES:最低声音会振动
2.设置是否让麦克风静音。
void setMicrophoneMute(booleanon)
设置为true将麦克风静音;false关闭静音
3.设置声音模式。
void setMode(intmode)
可设置的值有 NORMAL,RINGTONE, 和IN_CALL。
3.设置手机电话铃声的模式。
void setRingerMode(intringerMode)
可支持如下几个属性值。
RINGER_MODE_NORMAL:正常的手机铃声。
RINGER_MODE_SILENT:手机铃声静音。
RINGER_MODE_VIBRATE:手机震动。
4.设置扬声器打开或关闭。
void setSpeakerphoneOn(booleanon)
设置为true开启免提通话;false关闭免提。
5.将手机的指定类型的声音调整为静音。
void setStreamMute(intstreamType,booleanstate)
其中streamType参数与adjustStreamVolume方法中第一个参数的意义相同。
6.直接设置手机的指定类型的音量值。
void setStreamVolume (int streamType, int index, int flags)
其中streamType参数与adjustStreamVolume方法中第一个参数的意义相同。
1.请求音频焦点
requestAudioFocus(AudioManager.OnAudioFocusChangeListener l,int streamType,int durationHint):
参数一:申请成功后对AudioFocus的监听;
参数二:音频类型
AudioManager.STREAM_ALARM : 手机闹钟
AudioManager.STREAM_RING : 电话铃声
AudioManager.STREAM_MUSIC : 手机音乐
AudioManager.STREAM_SYSTEM : 手机系统
AudioManager.STREAM_DTMF : 音调
AudioManager.STREAM_NOTIFICATION : 系统提示
AudioManager.STREAM_VOICE_CALL : 语音电话
参数三:音频焦点状态
1).获得焦点
AudioManager.AUDIOFOCUS_GAIN:应用获得了AudioFocus;执行操作:播放或继续播放
AUDIOFOCUS_GAIN_TRANSIENT:暂时获取焦点 适用于短暂的音频
AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK:应用跟其他应用共用焦点但播放的时候其他音频会降低音量
2).失去焦点
AudioManager.AUDIOFOCUS_LOSS: 应用失去了Audio Focus;执行操作:暂停播放,最好释放资源
需要停止Audio的播放,并且释放Media资源。
为了避免再次自动获得AudioFocus而继续播放,不然突然冒出来的声音会让用户感觉莫名其妙,直接放弃AudioFocus。
如果需要再次播放,用户要在界面上点击开始播放,才重新初始化Media,进行播放。
AudioManager.AUDIOFOCUS_LOSS_TRANSIENT:暂时失去AudioFocus,并会很快再次获得。
必须停止Audio的播放,但是因为是暂时失去AudioFocus,可以不释放Media资源;
FOCUS_LOSS_TRANSIENT_CAN_DUCK:当前应用暂时失去AudioFocus,但是可以继续播放,不过要降低音量。
返回值:
AUDIOFOCUS_REQUEST_GRANTED:申请成功;
AUDIOFOCUS_REQUEST_FAILED:申请失败;
2.放弃音频的焦点
abandonAudioFocus(AudioManager.OnAudioFocusChangeListenerl)
AudioFocus被抢占与再次获取的时序
第三方音频同步思路处理(参照网易云、QQ音乐),
其实每一段音频播放前都应该做一下处理,申请音频焦点,播完后再释放焦点。
第三方音频变化时,自己音频管理器的焦点状态
1.录制语音消息/播放语音消息
AUDIOFOCUS_LOSS_TRANSIENT 暂停播放,录制/播放结束后,会重新获取AudioFocus,继续播放
2.被动接收QQ/微信电话
AUDIOFOCUS_LOSS_TRANSIENT 暂停播放,录制/播放结束后,会重新获取AudioFocus,继续播放
3.主动拨打QQ/微信电话 或 使用第三方的播放器听歌(酷狗、QQ音乐等)
AUDIOFOCUS_LOSS 停止播放,挂断电话后,不能再获取到焦点,不再继续播放
参考:
https://blog.csdn.net/zhangyuehuan/article/details/51990034