zoukankan      html  css  js  c++  java
  • 安卓权威编程指南 -笔记(19章 使用SoundPool播放音频)

    针对BeatBox应用,可以使用SoundPool这个特别定制的实用工具。

    SoundPool能加载一批声音资源到内存中,并支持同时播放多个音频文件。因此所以,就算用户兴奋起来,狂按按钮播放全部音频,也不必担心会损坏应用或者耗光手机电量。

    1. 创建SoundPool

    1 /*
    2          * Lollipop引入了新的方式创建SoundPool:使用SoundPool.Builder。为了兼容api 16最低级别,只能选择使用SoundPool(int int int)这个老构造方法。
    3          * 第一个参数指定同时播放多少个音频,这里指定了5个。在播放5个音频时,如果在尝试播放第6个,SoundPool会停止播放原来的音频。
    4          * 第二个参数确定音频流类型。
    5          * 最后一个参数指定采样率转换品质。 不起作用 ,传入 0;
    6          */
    7         mSoundPool = new SoundPool(MAX_SOUNDS, AudioManager.STREAM_MUSIC, 0);
    8 //下为Sound.Builder方法
     mSoundPool = new SoundPool.Builder()
                .setMaxStreams(MAX_SOUNDS)
                .setAudioAttributes(new AudioAttributes.Builder()
                        .setLegacyStreamType(AudioManager.STREAM_MUSIC)
                        .build())
                .build();

    2. 加载音频文件

    相比其他音频播放方法,SoundPool还有个快速响应的优势,指令刚一发出,它就会立即开始播放,一点都不拖沓。代价就是在播放钱必须预先加载音频。SoundPool加载的音频文件都有自己的Integer类型ID。

    在Sound类中添加mSoundId实例变量,并添加相应的获取方法和设置方法管理这写ID。

    然后处理音频加载,在BeatBox中添加以下代码:

    private void load(Sound sound)throws IOException{
            AssetFileDescriptor afd = mAssets.openFd(sound.getAssetPath());
            //调用load(AssetFileDescriptor, int)方法可以把文件载入SoundPool待播、
            //此方法返回一个int性ID。这就是存储在mSoundId中的ID。
            int soundId = mSoundPool.load(afd,1);
            sound.setSoundId(soundId);
        }

    然后在BeatBox.loadSounds()方法中,调用load(Sound)方法载入全部音频文件。

    3.播放音频

    在BeatBox中添加一个play(sound)方法。

     1   public void play(Sound sound){
     2         Integer soundId = sound.getSoundId();
     3         //先检查并确保soundId是不是null值,Sound加载失败会导致soundId出现null值。
     4         if(soundId == null)
     5             return;
     6         /*
     7         * 调用play方法播放音频。
     8         * 这些参数依次是:音频ID,左音量,右音量,优先级(无效),是否循环以及播放速率。
     9         * 我们需要最大音量和长速播放,所以传入1.0,是否循环参数传入0值,代表不循环。 -1代表循环。
    10          */
    11         mSoundPool.play(soundId,1.0f,1.0f,1,0,1.0f);
    12     }

    最后添加按钮监听器方法,实现点击按钮播放音频。

    最后在onDestroy()方法中释放音频。

    4.保留fragment

    setRetainInstance(true)

    表示以保留的activity不会随activity一起被销毁,会一致保留并在需要时原封不懂的传递给新的activity

  • 相关阅读:
    封了1000多个IP地址段,服务器现在坚如磐石,对付几个小毛贼还是很轻松的
    这两周服务器被攻击,封锁了600多个IP地址段后今天服务器安静多了
    centos clamav杀毒软件安装配置及查杀,没想到linux下病毒比windows还多!
    JS 在页面上直接将json数据导出到excel,支持chrome,edge,IE10+,IE9,IE8,Safari,Firefox
    一个实战系统的权限架构思维推导过程
    股灾情形下搞了个满堂红,我也是醉了
    VBC#代码互转工具
    DSAPI多功能.NET函数库组件
    DS标签控件文本解析格式
    DSAPI官方QQ群
  • 原文地址:https://www.cnblogs.com/chase1/p/7195966.html
Copyright © 2011-2022 走看看