音效没声音很多情况:
1、不支持的音效格式(ogg,MP3,wav)
2、加载未完成时调用play播放音频。表现为前面无声音,过一段时间有声音。可以实现onLoadComplete()监听等待加载完成后再去播放。
pool.setOnLoadCompleteListener(new SoundPool.OnLoadCompleteListener() {
@Override
public void onLoadComplete(SoundPool soundPool, int sampleId, int status) {
if (status == 0){
// 加载完成
}
}
});
3、调用了SoundPool.release()之后没有再初始化。
这种场景也经常出现,当我们接收手机设置铃声音量变化,静音和振动状态下需要关闭声音播放,标准状态下重新初始化,如果从静音模式切换到铃声模式忘记初始化,就会出现无声现象。
类型 | 操作 |
---|---|
静音 | relase |
震动 | relase |
标准 | init |
4、静音模式下继续播放声音,有时候导致无法结束,下一次播放为无声。
在播放音频时判断当前是否标准模式:
if (ringerMode == AudioManager.RINGER_MODE_VIBRATE) {
// 振动
} else if (ringerMode != AudioManager.RINGER_MODE_NORMAL) {
// 非标准模式直接退出
return;
}
5、Android 5.0以上已废弃直接通过new SoundPool方式创建
5.0以上版本建议使用builder方式创建SoundPool,在9.0以下还未发现使用new SoundPool有什么问题,9.0很多机型继续使用new SoundPool方式部分room已无效。
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
AudioAttributes attr = new AudioAttributes.Builder()
.setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION)
.setUsage(AudioAttributes.USAGE_ASSISTANCE_SONIFICATION)
.build();
soundPool = new SoundPool.Builder()
.setMaxStreams(SOUNDLENGTH)
.setAudioAttributes(attr)
.build();
} else {
soundPool = new SoundPool(SOUNDLENGTH, streamType, 0);
}
需要关注AudioAttributes的ContentType和Usage属性:
contentType描述音频信号的内容类型的属性,例如语音或音乐。
ContentType 类型 | 解释 | 场景 |
---|---|---|
CONTENT_TYPE_MOVIE | 视频类型音频信号 | 当内容类型为电影或电视节目时,通常使用的内容类型值。 |
CONTENT_TYPE_MUSIC | 音乐媒体类型音频信号 | 内容类型为音乐时使用的内容类型值。 |
CONTENT_TYPE_SONIFICATION | 发声点击类音频信号 | 当内容类型是伴随用户动作的声音时使用的内容类型值,例如表示按键点击的哔哔声效果或事件,例如在游戏中接收到的奖金的声音,例如点击键盘声音类型。这些声音大多是合成的或短的Foley声音。 |
CONTENT_TYPE_SPEECH | 语音类音频信号 | 当内容类型为语音时要使用的内容类型值 |
CONTENT_TYPE_UNKNOWN | 其它 | 在内容类型未知时使用的该值。 |
Usage设置描述音频信号的预期用途的属性,例如警报或铃声。
这里列举几个常用的,其它详情可以查看API
Usage 类型 | 场景 |
---|---|
USAGE_MEDIA | 使用在媒体,如音乐,或电影配乐。 |
USAGE_VOICE_COMMUNICATION | 使用在语音通信,例如电话或VoIP。 |
USAGE_ALARM | 使用在闹铃(例如唤醒闹铃)。 |
USAGE_ASSISTANCE_SONIFICATION | 使用在用户行为声音,如用户使用,点击界面声音 |
USAGE_GAME | 使用在游戏场景音频 |
USAGE_NOTIFICATION | 使用在通知相关声音 |
根据app具体类型和使用场景选择对应ContentType和Usage
例如:键盘点击类自定义播放音频
AudioAttributes attr = new AudioAttributes.Builder()
.setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION)
.setUsage(AudioAttributes.USAGE_ASSISTANCE_SONIFICATION)
.build();