Android中除了MediaPlayer播放音频之外,还提供了SoundPool来播放音效,SoundPool使用音效池的概念来管理多个短促的音效。先了解一下SoundPool与MediaPlayer的不同之处在哪里:

MediaPlayer:占用资源较高,不支持同时播放多个音频。

SoundPool:可以同时播放多个短促的音频,而且占用的资源较少。适合在程序中播放按键音,或者消息提示音等。

【SoundPool构造器】
SoundPool提供了一个构造器,该构造器可以指定它总共支持多少个声音(也就是池的大小)、声音的品质等。

构造器如下: 
SoundPool(int maxStreams, int streamType, int srcQuality)
参数maxStreams:指定支持多少个声音; 
参数streamType:指定声音类型: 
参数srcQuality:指定声音品质。

在得到了SoundPool对象之后,接下来就可调用SoundPool的多个重载的load方法来加载声音了。

SoundPool提供了如下4个load方法:
//从 resld 所对应的资源加载声音。
int load(Context context, int resld, int priority)
//加载 fd 所对应的文件的offset开始、长度为length的声音。
int load(FileDescriptor fd, long offset, long length, int priority)
//从afd 所对应的文件中加载声音。
int load(AssetFileDescriptor afd, int priority)
//从path 对应的文件去加载声音。
int load(String path, int priority)
上面4个方法在加载声音之后,都会返回该声音的ID,以后程序就可以通过该声音的ID来播放指定声音。

SoundPool提供的播放指定声音的方法:
int play(int soundID, float leftVolume, float rightVolume, int priority, int loop, float rate)
参数soundID:指定播放哪个声音; 
参数leftVolumerightVolume:指定左、右的音量: 
参数priority:指定播放声音的优先级,数值越大,优先级越高; 
参数loop:指定是否循环,0:不循环,-1:循环,其他值表示要重复播放的次数;
参数rate:指定播放的比率,数值可从0.5到2, 1为正常比率。
 

最后,release()方法,用于释放所有SoundPool对象占据的内存和资源,也可以指定要释放的ID。

至于音频文件的导入,在Android Studio的res文件夹创建raw文件夹,然后把音频文件拷贝到raw文件夹下面即可。

 

以下是示例代码:

package com.yzbt.soundpooltest;import android.media.AudioAttributes;import android.media.AudioManager;import android.media.SoundPool;import android.os.Build;import android.support.annotation.NonNull;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.view.KeyEvent;import android.view.View;import android.widget.Button;import java.util.Collection;import java.util.HashMap;import java.util.Map;public class MainActivity extends AppCompatActivity implements View.OnClickListener {    private Button button1, button2, button3, button4;    private SoundPool soundpool;    private Map soundmap = new HashMap();    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        button1 = (Button)findViewById(R.id.button1);        button2 = (Button)findViewById(R.id.button2);        button3 = (Button)findViewById(R.id.button3);        button4 = (Button)findViewById(R.id.button4);        button1.setOnClickListener(this);        button2.setOnClickListener(this);        button3.setOnClickListener(this);        button4.setOnClickListener(this);        //当前系统的SDK版本大于等于21(Android 5.0)时        if(Build.VERSION.SDK_INT > 21){            SoundPool.Builder builder = new SoundPool.Builder();            //传入音频数量            builder.setMaxStreams(5);            //AudioAttributes是一个封装音频各种属性的方法            AudioAttributes.Builder attrBuilder = new AudioAttributes.Builder();            //设置音频流的合适的属性            attrBuilder.setLegacyStreamType(AudioManager.STREAM_SYSTEM);//STREAM_MUSIC            //加载一个AudioAttributes            builder.setAudioAttributes(attrBuilder.build());            soundpool = builder.build();        }else{            soundpool = new SoundPool(5, AudioManager.STREAM_SYSTEM, 0);        }        //        soundmap.put(1, soundpool.load(this, R.raw.chimes, 1));        soundmap.put(2, soundpool.load(this, R.raw.enter, 1));        soundmap.put(3, soundpool.load(this, R.raw.notify, 1));        soundmap.put(4, soundpool.load(this, R.raw.ringout, 1));        soundmap.put(5, soundpool.load(this, R.raw.ding, 1));    }    @Override    public boolean onKeyDown(int keyCode, KeyEvent event) {        soundpool.play(soundmap.get(5), 1, 1, 0, 0, 1);        //return  true;        return super.onKeyDown(keyCode, event);    }    @Override    protected void onDestroy() {        soundpool.release();//回收soundpool资源        super.onDestroy();    }    @Override    public void onClick(View view) {        switch (view.getId())        {            case R.id.button1:                soundpool.play(soundmap.get(1), 1, 1, 0, 0, 1);                break;            case R.id.button2:                soundpool.play(soundmap.get(2), 1, 1, 0, 0, 1);                break;            case R.id.button3:                soundpool.play(soundmap.get(3), 1, 1, 0, 0, 1);                break;            case R.id.button4:                soundpool.play(soundmap.get(4), 1, 1, 0, 0, 1);                break;        }    }}

欢迎童鞋们访问并收藏我的博客小程序:

更多相关文章

  1. 开源项目之Android(安卓)Afinal框架
  2. Android(安卓)Cursor自动更新的实现和原理
  3. 【Android(安卓)界面效果11】android 瀑布流效果(仿蘑菇街)
  4. Android(安卓)Jetpack之Navigation
  5. Android(安卓)HAL层模块的加载过程
  6. Afinal 介绍
  7. Handler+Message+MessageQuque+Looper 异步加载类 消息处理机制
  8. MUI在ios中的一些问题
  9. Android中WebView的使用指南:

随机推荐

  1. Android学习之抽象类AbsListView
  2. Android:UI更新方法二:View.postInvalida
  3. android执行脚本语言完成root
  4. 运用BitmapFactory.Options来改善程序加
  5. 判断网络状态
  6. android 联系人搜索
  7. Android(安卓)first stage bootlogo
  8. Android(安卓)《第一行代码》 第二章练习
  9. 介绍 Android(安卓)DropBoxManager Servi
  10. Kotlin实战问题汇总