[故障及解决]SoundPool没有声音

问题描述:

使用SoundPool类进行播放声音时,在手机上没有声音。


问题代码:

/**
 * 声音播放
 */
private void playSound() {
    SoundPool soundPool = new SoundPool(10, AudioManager.STREAM_SYSTEM, 5);
    soundPool.load(this, R.raw.beep, 1); // 加载资源,返回1
    soundPool.play(1, 1, 1, 0, 0, 1); // 播放,返回0
}

问题原因:

SoundPool池加载声音,在调用load方法的时候,是使用其他线程来加载资源的,所以上述代码在执行play方法的时候,资源还没有加载,故没有声音。

修改方法,就是中间留出足够的时间来进行加载声音文件,或追加加载完成的监听器来监听是否完成(SoundPool.OnLoadCompleteListener类的方法onLoadComplete(SoundPool soundPool, int sampleId, int status) )。


正确代码:

因为声音文件很小,所以就在onCreate方法中加载文件,后面进行播放。

private SoundPool soundPool; // 声音加载池

protected void onCreate(Bundle savedInstanceState) {
// 门声音预加载
    soundPool = new SoundPool(10, AudioManager.STREAM_SYSTEM, 5);
    soundPool.load(this, R.raw.beep, 1);
}

/**
 * 声音播放
 */
private void playSound() {
    soundPool.play(1, 1, 1, 0, 0, 1);
}

知识点延伸:

常用的播放类:

android中,同创进行声音播放的有MediaPlayer和SoundPool。


MediaPlayer:常用来播放长一些的音频、视频和流媒体,每次仅能播放一个,有控制播放的各种方法。

SoundPool:常用来播放短促并且实时性高的音频,每次可以多个同时播放,比方说游戏中的爆破声。


SoundPool类的播放方法(部分):



以上述代码为例,进行分析。当然都有其他的重载的方法。


SoundPool soundPool = new SoundPool(10, AudioManager.STREAM_SYSTEM, 5);

->

public SoundPool(int maxStream, int streamType, int srcQuality) 

初期化一个声音池。

maxStream:最大可放10个音频文件。

streamType:为声音的类型。如上为系统声音,其他还有音乐,铃声等等。

srcQuality:转化质量,默认为0。目前理解为,播放时的声音保真程度。一般对于短促的声音,影响不大。



soundPool.load(this, R.raw.beep, 1);

->

public int load(Context context, int resId, int priority)

通过本apk中的资源加载音频。其他加载方式还有,从Asset对象加载、从FileDescriptor对象加载、从全文件路径名加载。

context:本context。

resId:资源ID。

priority:加载优先级,一般为1。

返回值为int,表示加载的第几个文件。从1开始累加。这个返回1。


soundPool.play(1, 1, 1, 0, 0, 1);

->

public int play(int soundID, float leftVolume, float rightVolume,int priority, int loop, float rate);

播放声音文件。

soundID:表示流中第几个文件,为load方法的返回值。和load方法配合使用,见过用map进行传递数据。(实际上我感觉没必要)

leftVolume:左音量,通常为1。

rightVolume:右音量,通常为1。

priority:优先度,通常为0。

loop:是否循环。0表示不循环,1以上表示循环次数。

rate:表示播放速率。0.5-2之间。0.5表示减慢50%,2表示加速播放。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值