美文网首页
使用SoundPool播放音频文件,使用简单

使用SoundPool播放音频文件,使用简单

作者: 打酱油的日光灯 | 来源:发表于2019-03-15 00:06 被阅读0次

    背景

    在项目实际开发中,可能会遇到播放一段音频文件的需求,比如播放一段话,比如连续播放来电铃声等等,下面介绍使用SoundPool播放音频文件,工具类已封装好,复制粘贴即可使用

    实现目标

    1、播放音频文件,播放完即停止
    2、播放音频文件,循环播放

    说明

    播放音频文件有很多种方式,MediaPlayer播放音频,AudioTrack播放音频,Ringtone播放音频,SoundPool播放音频,此文章为SoundPool封装实例,复杂实现逻辑可以舍弃了,一句话即可实现播放音频


    下边介绍下使用说明

    1.播放指定音频文件,选择哪个播放哪个

    AVChatSoundPlayer.instance().play(AVChatSoundPlayer.RingerTypeEnum.LY_CONNECT);
    

    2.循环播放音频文件

    public synchronized void play(RingerTypeEnum type) 
            this.ringerTypeEnum = type;
            int ringId = 0;
            switch (type) {
                case LY_CONNECT:
                    ringId = R.raw.avchat_ly_connect;
                    loop = false;//是否重复播放铃声
                    break;
                case LY_CLOSE:
                    ringId = R.raw.avchat_ly_close;
                    loop = true;
                    break;
            }
        }
    

    将loop改成true,即循环播放
    3.停止播放音频文件

    AVChatSoundPlayer.instance().stop();
    

    所需文件

    1.新建raw目录,将所需要播放的音频文件放入,建议音频文件不要超过1M,因为在不同的系统下 SoundPool 表现可能存在不一致


    raw.jpg

    2.复制工具类AVChatSoundPlayer

    /**
     * SoundPool 铃声尽量不要超过1M
     * 在不同的系统下 SoundPool 表现可能存在不一致
     */
    public class AVChatSoundPlayer {
    
        private static final String TAG = "Lp_Player";
    
        public enum RingerTypeEnum {
            LY_CONNECT,
            LY_CLOSE,
            MEN_KAI,
            MEN_CLOSE,
            RING
            ;
        }
        private Context context;
    
        private SoundPool soundPool;
        private AudioManager audioManager;
        private int streamId;
        private int soundId;
        private boolean loop;
        private RingerTypeEnum ringerTypeEnum;
        private boolean isRingModeRegister = false;
        private int ringMode = -1;
    
        private static AVChatSoundPlayer instance = null;
        private RingModeChangeReceiver ringModeChangeReceiver;
    
        public static AVChatSoundPlayer instance() {
            if(instance == null) {
                synchronized (AVChatSoundPlayer.class) {
                    if(instance == null) {
                        instance = new AVChatSoundPlayer();
                    }
                }
            }
            return instance;
        }
    
        public AVChatSoundPlayer() {
            this.context = AppUMS.mContent;//全局上下文对象,getApplicationContext();
    }
    
        public synchronized void play(RingerTypeEnum type) {
            L.e(TAG, "play type->" + type.name());
            this.ringerTypeEnum = type;
            int ringId = 0;
            switch (type) {
                case LY_CONNECT:
                    ringId = R.raw.avchat_ly_connect;
                    loop = false;//是否重复播放铃声
                    break;
                case LY_CLOSE:
                    ringId = R.raw.avchat_ly_close;
                    loop = false;
                    break;
                case MEN_KAI:
                    ringId = R.raw.avchat_men_kai;
                    loop = false;
                    break;
                case MEN_CLOSE:
                    ringId = R.raw.avchat_men_close;
                    loop = false;
                    break;
                case RING:
                    ringId = R.raw.avchat_ring;
                    loop = true;
                    break;
            }
    
            if(ringId != 0) {
                play(ringId);
            }
        }
    
        public void stop() {
            L.e(TAG, "stop");
            if (soundPool != null) {
                if (streamId != 0) {
                    soundPool.stop(streamId);
                    streamId = 0;
                }
                if (soundId != 0) {
                    soundPool.unload(soundId);
                    soundId = 0;
                }
            }
            if (isRingModeRegister) {
                registerVolumeReceiver(false);
            }
        }
    
        private void play(int ringId) {
            initSoundPool();
            if (audioManager.getRingerMode() == AudioManager.RINGER_MODE_NORMAL) {
                soundId = soundPool.load(context, ringId, 1);
            }
        }
    
        private void initSoundPool() {
            stop();
            if (soundPool == null) {
                soundPool = new SoundPool(1, AudioManager.STREAM_RING, 0);
                soundPool.setOnLoadCompleteListener(onLoadCompleteListener);
    
                audioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
                ringMode = audioManager.getRingerMode();
            }
            registerVolumeReceiver(true);
        }
    
        SoundPool.OnLoadCompleteListener onLoadCompleteListener = new SoundPool.OnLoadCompleteListener() {
            @Override
            public void onLoadComplete(SoundPool soundPool, int sampleId, int status) {
                if (soundId != 0 && status == 0) {
                    if (audioManager.getRingerMode() == AudioManager.RINGER_MODE_NORMAL) {
                        int curVolume = audioManager.getStreamVolume(AudioManager.STREAM_RING);
                        streamId = soundPool.play(soundId, curVolume, curVolume, 1, loop ? -1 : 0, 1f);
                    }
                }
            }
        };
    
        private void registerVolumeReceiver(boolean register){
            if (ringModeChangeReceiver == null) {
                ringModeChangeReceiver = new RingModeChangeReceiver() ;
            }
    
            if (register) {
                isRingModeRegister = true;
                IntentFilter filter = new IntentFilter() ;
                filter.addAction(AudioManager.RINGER_MODE_CHANGED_ACTION) ;
                context.registerReceiver(ringModeChangeReceiver, filter) ;
            } else {
                context.unregisterReceiver(ringModeChangeReceiver);
                isRingModeRegister = false;
            }
        }
    
        private class RingModeChangeReceiver extends BroadcastReceiver {
            @Override
            public void onReceive(Context context, Intent intent) {
                if (ringMode != -1 && ringMode != audioManager.getRingerMode()
                        && intent.getAction().equals(AudioManager.RINGER_MODE_CHANGED_ACTION)) {
                    ringMode = audioManager.getRingerMode();
                    play(ringerTypeEnum);
                }
            }
        }
    }
    

    最后,祝大家开发顺利!

    相关文章

      网友评论

          本文标题:使用SoundPool播放音频文件,使用简单

          本文链接:https://www.haomeiwen.com/subject/ldqkmqtx.html