Android自助餐之SoundPool

Android自助餐之SoundPool

  • Android自助餐之SoundPool

    • SoundPool介绍
    • 主要方法
    • 使用方法
    • 使用示例

SoundPool介绍

  1. SoundPool相对于MediaPlayer,用前者播放短但反应速度要求高的声音以及同时播放多个声音。
  2. SoundPool使用独立的线程载入声音,SoundPool.OnLoadCompleteListener回调载入完成后的方法。

主要方法

  1. 加载声音。返回值为soundID。

    priority参数无效,置1

    若文件大于1M,则只加载前1M

    int load(AssetFileDescriptor afd, int priority) //通过一个AssetFileDescriptor对象

    int load(Context context, int resId, int priority) //通过一个资源ID

    int load(String path, int priority) //通过指定的路径加载

    int load(FileDescriptor fd, long offset, long length, int priority) //通过FileDescriptor加载

  2. 播放控制。

    final int play(int soundID, float leftVolume, float rightVolume, int priority, int loop, float rate) //播放指定音频的音效,并返回一个streamID 。

    //priority —— 流的优先级,值越大优先级高,影响当同时播放数量超出了最大支持数时SoundPool对该流的处理;

    //loop —— 循环播放的次数,0为值播放一次,-1为无限循环,其他值为播放loop+1次(例如,3为一共播放4次).

    //rate —— 播放的速率,范围0.5-2.0(0.5为一半速率,1.0为正常速率,2.0为两倍速率)

    final void pause(int streamID) //暂停指定播放流的音效(streamID 应通过play()返回)。

    final void resume(int streamID) //继续播放指定播放流的音效(streamID 应通过play()返回)。

    final void stop(int streamID) //终止指定播放流的音效(streamID 应通过play()返回)。

  3. 释放资源。

    final boolean unload(int soundID) //卸载一个指定的音频资源.

    final void release() //释放SoundPool中的所有音频资源.

使用方法

  1. 构造声音池

    SoundPool soundPool=new SoundPool(5,AudioManager.STREAM_MUSIC,0);

  2. 准备声音集

    Map<Integer, Integer> soundMap=new HashMap<Integer, Integer>();

    soundMap.put(1, soundPool.load(MainActivity.this, R.raw.ir_begin, 1));

    soundMap.put(2, soundPool.load(MainActivity.this, R.raw.ir_end, 1));

    soundMap.put(3, soundPool.load(MainActivity.this, R.raw.ir_inter, 1));

    soundMap.put(4, soundPool.load(MainActivity.this, R.raw.tada, 1));

    soundMap.put(5, soundPool.load(MainActivity.this, R.raw.zhong, 1));

  3. 播放一个音频

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

使用示例

 public class MainActivity extends Activity {
    //1.准备资源文件。在res资源目录中新建一个raw子目录,将需要加载的音频文件放入其中,比如加载了shiqishidaibeijingyinyue.mp3
    private SoundPool soundPool;
    private int soundId;
    private boolean flag = false;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //2.实现soundPool对象
        soundPool = new SoundPool(5, AudioManager.STREAM_MUSIC, 0); //分别对应声音池数量,AudioManager.STREAM_MUSIC 和 0

        //3.使用soundPool加载声音,该操作位异步操作,如果资源很大,需要一定的时间
        soundId = soundPool.load(this, R.raw.shiqishidaibeijingyinyue, 1);

        //4.为声音池设定加载完成监听事件
        soundPool.setOnLoadCompleteListener(new SoundPool.OnLoadCompleteListener() {
            @Override
            public void onLoadComplete(SoundPool soundPool, int sampleId, int status) {
                flag = true;    //  表示加载完成
            }
        });
    }
    //5.播放操作
    public void click(View view){
        if(flag){
            //  播放声音池中的文件, 可以指定播放音量,优先级 声音播放的速率
            soundPool.play(soundId, 1.0f, 0.5f, 1, 0, 1.0f);
        }else{
            Toast.makeText(this, "正在加载,请稍后", 1).show();
        }
    }

    //6.使用完全后,应该释放资源
    @Override
    protected void onDestroy() {
        soundPool.release();
        soundPool = null;
        super.onDestroy();
    }
 }
时间: 2024-10-19 17:43:33

Android自助餐之SoundPool的相关文章

Android开发之SoundPool使用详解

使用SoundPool播放音效 如果应用程序经常播放密集.急促而又短暂的音效(如游戏音效)那么使用MediaPlayer显得有些不太适合了.因为MediaPlayer存在如下缺点: 1)         延时时间较长,且资源占用率高. 2)         不支持多个音频同时播放. Android中除了MediaPlayer播放音频之外还提供了SoundPool来播放音效,SoundPool使用音效池的概念来管理多个短促的音效,例如它可以开始就加载20个音效,以后在程序中按音效的ID进行播放.

Android自助餐之EventBus框架

Android自助餐之EventBus框架 Android自助餐之EventBus框架 下载完整源代码 配置buildgrandle 实例化EventBus 注册事件监听 定义被传递的事件类 发送事件 处理时间 下载完整源代码 配置build.grandle compile 'de.greenrobot:eventbus:2.4.0' 实例化EventBus eventBus=EventBus.builder().build(); 注册事件监听 eventBus.register(this);

【Android自助餐】Handler消息机制完全解析(二)MessageQueue的队列管理

Android自助餐Handler消息机制完全解析(二)MessageQueue的队列管理 Android自助餐Handler消息机制完全解析二MessageQueue的队列管理 添加到消息队列enqueueMessage 从队列取出消息next 第一段 第三段 第二段 从队列移除消息removeMessages 第一个while 第二个while 关于这个队列先说明一点,该队列的实现既非Collection的子类,亦非Map的子类,而是Message本身.因为Message本身就是链表节点(见

【Android自助餐】Handler消息机制完全解析(一)Message中obtain()与recycle()的来龙去脉

[Android自助餐]Handler消息机制完全解析(一)Message中obtain()与recycle()的来龙去脉 Android自助餐Handler消息机制完全解析一Message中obtain与recycle的来龙去脉 提供obtain 回收recycle 提供obtain() 在obtain的所有重载方法中,第一行都是Message m = obtain();,即调用空参的方法. 先来看一下这个空参方法 public static Message obtain() { synchr

Android自助餐之解析zip

Android自助餐之解析zip Android自助餐之解析zip 获取文件的所有节点游标 遍历每个节点 处理一个节点 解压文件思路解压某个ZipFile到指定目标路径 直接用的代码 获取文件的所有节点游标 Enumeration entries = zipFile.entries();//ZipFile为java.util.zip.ZipFile 遍历每个节点 while(entries.hasMoreElements()){ //do something } 处理一个节点 ZipEntry

Android自助餐之大图片加载

Android自助餐之大图片加载 原理 使用BitmapFactory.decodeStreeam()方法,该方法会调用native层代码来创建bitmap(两个重载都会调用) 使用带BitmapFactory.Options参数的方法,改参数可指定生成bitmap的大小 思路 根据View尺寸或Window尺寸来确定bitmap的尺寸 将确定好的尺寸放入BitmapFactory.Options 调用BitmapFactory.decodeStreeam()生成bitmap 步骤 根据图片路径

Android自助餐之AsyncTask

Android自助餐之AsyncTask [toc] 耗时操作可以使用AsyncTask. 创建AsyncTask需要传递三个泛型:Params.Progress.Result. Params启动任务执行的输入参数,比如HTTP请求的URL Progress后台任务执行的百分比 Result后台执行任务最重返回的结果 使用AsyncTask需要重写的方法 doInBackground()后台执行比较耗时的操作. 不能直接操作UI:在执行过程中可以调用publishProgress()来更新任务的

Android自助餐之自定义控件(一)从layout自定义控件

Android自助餐之自定义控件(一)从layout自定义控件 Android自助餐之自定义控件一从layout自定义控件 从layout自定义控件 从layout自定义控件 layout中新建一个layout <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android&qu

Android自助餐之adb使用场景

Android自助餐之adb使用场景 Android自助餐之adb使用场景 命令列表 命令列表 adb devices 列出所有的设备 adb start-server 开启adb服务 adb kill-server 关闭adb服务 adb logcat 查看Log adb shell 挂载到Linux的空间 adb install <应用程序(加扩展名)> 安装应用程序 adb –s <模拟器名称> install <应用程序(加扩展名)> 安装应用到指定模拟器 ad