目录

一、AudioManager类介绍

二、AudioManager方法简介

三、AudioManager常用方法

四、申请音频焦点

五、第三方音频同步思路处理


一、AudioManager类介绍

1.AudioManager类提供了音量控制与铃声模式相关操作。

2.实例化:AudioManager am = (AudioManager)context.getSystemService(Context.AUDIO_SERVICE);

二、AudioManager方法简介

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)

调整最相关的流的音量,或者给定的回退流。

三、AudioManager常用方法

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

更多相关文章

  1. Android(安卓)音频源码目录
  2. Android(安卓)使用Vitamio实现播放视频(一)
  3. android沉浸式状态栏的实现
  4. GDB在线调试Android(安卓)Framework Native C/C++代码
  5. Android设置透明、半透明等效果
  6. Android(安卓)RadioGroup设置默认选中项
  7. 关于android中Email未设置账户的情况下发送mailto异常
  8. android虚拟机大屏幕设置
  9. Android(安卓)修改状态栏和标题栏颜色

随机推荐

  1. 在android 两个类之间 get,set方法传参使
  2. Android ListView里设置默认Item的背景颜
  3. android中的Inflater
  4. JS判断客户端是否是iOS或者Android手机移
  5. android EditText+ListView的组合(类似于A
  6. Android调用js的坑
  7. Manpower代招-高级Android开发工程师@成
  8. android 读取assets指定文件
  9. Android(安卓)Activity之间跳转出现短暂
  10. android关于加载本地html5的问题(解决办