SoundPool用于对于应用内音频的管理及播放.拥有占用资源小,延时短,支持同时播放多个音频的优点.但由于SoundPool最大只能申请1MB的内存,所以只能播放极短的音频片段.适用于需要播放急促而短暂的音频效果的应用场景.
构造
@java.lang.Deprecated
public SoundPool(int maxStreams, int streamType, int srcQuality)
该构造函数在Android5.0之后被废弃,后续版本使用SoundPool.Builder进行构建.
//setMaxStreams设置最大音频流数
//setAudioAttributes所需要的对象在下文有详细描述
SoundPool.Builder().setMaxStreams(10).setAudioAttributes(null).build()
AudioAttributes
描述音频的属性,SoundPool会根据所传入的AudioAttributes对象来针对音频做相应的处理
setAllowedCapturePolicy(int capturePolicy)
设置音频是否能被其他应用捕获
-
AudioAttributes.ALLOW_CAPTURE_BY_ALL
音频可以被任何应用捕获
-
AudioAttributes.ALLOW_CAPTURE_BY_SYSTEM
音频只能被系统应用捕获
-
AudioAttributes.ALLOW_CAPTURE_BY_NONE
音频不可被任何应用捕获
setContentType(int contentType)
设置音频的内容类型
-
AudioAttributes.CONTENT_TYPE_MOVIE
内容用于在TV或电影的配乐
-
AudioAttributes.CONTENT_TYPE_MUSIC
内容为音乐
-
AudioAttributes.CONTENT_TYPE_SONIFICATION
用于伴随用于点击时的提示音.比如按键点击或者游戏中收到金币的声音
-
AudioAttributes.CONTENT_TYPE_SPEECH
内容为语音时使用
-
AudioAttributes.CONTENT_TYPE_UNKNOWN
音频内容未知
setFlags(int flags)
标记对于音频播放的应用效果,可以添加多个flag
-
AudioAttributes.FLAG_AUDIBILITY_ENFORCED
向系统发出请求,以保证声音可听性
-
AudioAttributes.FLAG_HW_AV_SYNC
向系统发出请求,支持硬件A/V同步的输出流
setLegacyStreamType(int streamType)
设置一些旧版的流数据类型时使用,其中传入的type皆为Android 9废弃的流类型标签.官方更推荐使用setUsage(int)和setContentType(int)
setUsage(int usage)
描述音频预期的用途
| 标签 | 用途 |
|---|---|
| USAGE_UNKNOWN | 未知 |
| USAGE_MEDIA | 媒体音频,例如电影配乐或音乐 |
| USAGE_VOICE_COMMUNICATION | 语音通信 |
| USAGE_VOICE_COMMUNICATION_SIGNALLING | 语音通信时的提示声 |
| USAGE_ALARM | 警报提示声 |
| USAGE_NOTIFICATION | 通知 |
| USAGE_NOTIFICATION_RINGTONE | 电话铃声的通知声 |
| USAGE_NOTIFICATION_COMMUNICATION_REQUEST | 进入或结束通信时的提示声 |
| USAGE_NOTIFICATION_COMMUNICATION_INSTANT | 即时通讯提示声(如微信) |
| USAGE_NOTIFICATION_COMMUNICATION_DELAYED | 非即时通讯提示声(如收到邮件) |
| USAGE_NOTIFICATION_EVENT | 吸引用户注意的提示声(如电量报警) |
| USAGE_ASSISTANCE_ACCESSIBILITY | 提示可访问 |
| USAGE_ASSISTANCE_NAVIGATION_GUIDANCE | 驾驶或导航音频 |
| USAGE_ASSISTANCE_SONIFICATION | 用户界面声音 |
| USAGE_GAME | 游戏声音 |
| USAGE_ASSISTANT | 引导音频(例如指导用户操作) |
API
load
//加载资源,priority为声音的优先级,但目前没任何效果,官方建议为了以后的兼容该值目前都传1
public int load (Context context, int resId, int priority)
public int load (String path, int priority)
public int load (AssetFileDescriptor afd, int priority)
public int load (FileDescriptor fd, long offset, long length, int priority)
//设置加载完成的监听
public void setOnLoadCompleteListener (SoundPool.OnLoadCompleteListener listener)
play
//soundId 音频id
//leftVolume/rightVolume 左右声道的音量值(0 -> 1)
//priority 优先级
//loop 是否循环 0不循环 1永久循环
//rate 播放速率 默认为1 取值为 0.5到2
public final int play (int soundID, float leftVolume, float rightVolume, int priority, int loop, float rate)
有两个id很常用,一个是load()返回的soundID,还有一个是play()返回的streamID
暂停/恢复/停止
public final void pause (int streamID)
public final void resume (int streamID)
public final void stop (int streamID)
//暂停所有音频
public final void autoPause ()
//恢复由autoPause()暂停的所有音频
public final void autoResume ()
动态操作
//设置循环
public final void setLoop (int streamID, int loop)
//优先级
public final void setPriority (int streamID, int priority)
//播放速率
public final void setRate (int streamID, float rate)
//左右声道音量
public final void setVolume (int streamID, float leftVolume, float rightVolume)
释放
//卸载该音频
public final boolean unload (int soundID)
//释放SoundPool所占用的内存等本机资源,调用该函数之后应将SoundPool设置为null
public final void release ()