Android SoundPool语音播报工具类

项目中需要用到语音提示,且都是比较简短的语音提示,刚开始的时候用的是MediaPlayer进行语音播放,但是查阅资料发现MediaPlayer主要是用来进行长音频播放,且资源消耗较高,后发现SoundPool进行语音播放时资源消耗更少,且响应速度更快,就写了一个简单的SoundPool工具类,主要是用来进行短音频播放,还可以判断当前是否有音频正在播放。
工具类代码如下:

/**
 * 简短音频播放工具类
 */
public class SoundPoolUtil {
    private volatile static SoundPoolUtil client;
    private SoundPool mSoundPool;
    private AudioManager mAudioManager;
    /*允许同时播放的音频数(为1时会立即结束上一个音频播放当前的音频)*/
    private static final int MAX_STREAMS = 1;
    // Stream type.
    private static final int streamType = AudioManager.STREAM_MUSIC;
    private int mSoundId;
    private int mResId;
    private Context mainContext;

    public static SoundPoolUtil getInstance(Context context) {
        if (client == null)
            synchronized (SoundPoolUtil.class) {
                if (client == null) {
                    client = new SoundPoolUtil(context);
                }
            }
        return client;
    }

    private SoundPoolUtil(Context context) {
        this.mainContext = context;
        mAudioManager = (AudioManager) this.mainContext.getSystemService(Context.AUDIO_SERVICE);
        ((Activity) this.mainContext).setVolumeControlStream(streamType);
        this.mSoundPool = new SoundPool(MAX_STREAMS, streamType, 0);
    }


    /**
     * 播放音频
     * @param resId 本地音频资源
     */
    public void playSoundWithRedId(int resId) {
        this.mResId = resId;
        this.mSoundId = this.mSoundPool.load(this.mainContext, this.mResId, 1);
        this.mSoundPool.setOnLoadCompleteListener(new SoundPool.OnLoadCompleteListener() {
            @Override
            public void onLoadComplete(SoundPool soundPool, int sampleId, int status) {
                playSound();
            }
        });

    }
    
    /**
     * 播放音频,但是当前有音频这正播放中时不响应该次音频播放
     * @param resId 本地音频资源
     */
    public synchronized void playSoundUnfinished(int resId) {
        if ( isFmActive()) return;
        this.mResId = resId;
        this.mSoundId = this.mSoundPool.load(this.mainContext, this.mResId, 1);
        mSoundPool.setOnLoadCompleteListener(new SoundPool.OnLoadCompleteListener() {
            @Override
            public void onLoadComplete(SoundPool soundPool, int sampleId, int status) {
                playSound();
            }
        });
    }

    /**
     * 播放音频文件
     */
    private void playSound() {
        mSoundPool.play(this.mSoundId, 1.0f, 1.0f, 0, 0, 1f);
    }

    /**
     * 判断当前设备是否正在播放音频
     */
    private boolean isFmActive() {
        if (mAudioManager == null) {
            return false;
        }
        return mAudioManager.isMusicActive();
    }
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 一、简历准备 1、个人技能 (1)自定义控件、UI设计、常用动画特效 自定义控件 ①为什么要自定义控件? Andr...
    lucas777阅读 5,278评论 2 54
  • android音频处理 音频基础概念 基础知识可以参考以下几篇文章: 音频,PCM,采样率及android的Aud...
    好奇的小刺猬阅读 2,561评论 0 3
  • ¥开启¥ 【iAPP实现进入界面执行逐一显】 〖2017-08-25 15:22:14〗 《//首先开一个线程,因...
    小菜c阅读 6,688评论 0 17
  • 那天周末,儿子他们和朋友一家在外相聚。席间,带着老妈的朋友问起我们为何不一起来?儿子答道,玩去啦。他们感到惊讶,俩...
    用心生活用字记录阅读 942评论 6 6
  • 日精进:敬畏—进入—体验—交给—持续 1,缺啥补啥,怕啥练啥; 2,切为我所用,所用为团队家; 3,我想变,我要...
    xiebo阅读 178评论 0 0