package eVVM.apk.helper; import android.content.Context; import android.media.AudioManager; import android.media.RingtoneManager; import android.media.SoundPool; import android.net.Uri; import android.support.annotation.IntDef; import android.support.annotation.NonNull; import android.support.annotation.RawRes; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.util.HashMap; import java.util.Map; /** *
 *     author: Chestnut
 *     blog  : http://www.jianshu.com/u/a0206b5f4526
 *     time  : 2017/6/22 17:24
 *     desc  :  封装了SoundPool
 *     thanks To:   http://flycatdeng.iteye.com/blog/2120043
 *                  http://www.2cto.com/kf/201408/325318.html
 *                  https://developer.android.com/reference/android/media/SoundPool.html
 *     dependent on:
 *     update log:
 *              1.  2017年6月28日10:39:46
 *                  1)修复了当play指定的RingtoneName为空的时候,触发的一个bug
 *                  2)增加了一个默认的铃声,当找不到系统的默认铃声时候,会默认加载一个我们提供的一个默认铃声
 * 
*/ public class SoundPoolHelper { /*常量*/ public final static int TYPE_MUSIC = AudioManager.STREAM_MUSIC; public final static int TYPE_ALARM = AudioManager.STREAM_ALARM; public final static int TYPE_RING = AudioManager.STREAM_RING; @IntDef({TYPE_MUSIC, TYPE_ALARM, TYPE_RING}) @Retention(RetentionPolicy.SOURCE) public @interface TYPE { } public final static int RING_TYPE_MUSIC = RingtoneManager.TYPE_ALARM; public final static int RING_TYPE_ALARM = RingtoneManager.TYPE_NOTIFICATION; public final static int RING_TYPE_RING = RingtoneManager.TYPE_RINGTONE; private static volatile int streamID = 0; @IntDef({RING_TYPE_MUSIC, RING_TYPE_ALARM, RING_TYPE_RING}) @Retention(RetentionPolicy.SOURCE) public @interface RING_TYPE { } /*变量*/ private SoundPool soundPool; private int NOW_RINGTONE_TYPE = RingtoneManager.TYPE_NOTIFICATION; private int maxStream; private Map ringtoneIds; /*方法*/ public SoundPoolHelper() { this(1, TYPE_MUSIC); } public SoundPoolHelper(int maxStream) { this(maxStream, TYPE_ALARM); } public SoundPoolHelper(int maxStream, @TYPE int streamType) { soundPool = new SoundPool(maxStream, streamType, 1); this.maxStream = maxStream; ringtoneIds = new HashMap<>(); } /** * 设置RingtoneType,这只是关系到加载哪一个默认音频 * 需要在load之前调用 * * @param ringtoneType ringtoneType * @return this */ public SoundPoolHelper setRingtoneType(@RING_TYPE int ringtoneType) { NOW_RINGTONE_TYPE = ringtoneType; return this; } /** * 加载音频资源 * * @param context 上下文 * @param resId 资源ID * @return this */ public SoundPoolHelper load(Context context, @NonNull String ringtoneName, @RawRes int resId) { if (maxStream == 0) return this; maxStream--; ringtoneIds.put(ringtoneName, soundPool.load(context, resId, 1)); return this; } /** * 加载默认的铃声 * * @param context 上下文 * @return this */ public SoundPoolHelper loadDefault(Context context) { Uri uri = getSystemDefaultRingtoneUri(context); // if (uri==null) // load(context,"default", R.raw.reminder); // else // load(context,"default",ConvertUtils.uri2Path(context,uri)); return this; } /** * 加载铃声 * * @param context 上下文 * @param ringtoneName 自定义铃声名称 * @param ringtonePath 铃声路径 * @return this */ public SoundPoolHelper load(Context context, @NonNull String ringtoneName, @NonNull String ringtonePath) { if (maxStream == 0) return this; maxStream--; ringtoneIds.put(ringtoneName, soundPool.load(ringtonePath, 1)); return this; } /** * int play(int soundID, float leftVolume, float rightVolume, int priority, int loop, float rate) : * 1)该方法的第一个参数指定播放哪个声音; * 2) leftVolume 、 * 3) rightVolume 指定左、右的音量: * 4) priority 指定播放声音的优先级,数值越大,优先级越高; * 5) loop 指定是否循环, 0 为不循环, -1 为循环; * 6) rate 指定播放的比率,数值可从 0.5 到 2 , 1 为正常比率。 */ public void play(@NonNull String ringtoneName, boolean isLoop) { if (ringtoneIds.containsKey(ringtoneName)) { streamID = soundPool.play(ringtoneIds.get(ringtoneName), 1, 1, 1, isLoop ? -1 : 0, 1); } } public void playDefault() { play("default", false); } /** * 释放资源 */ public void stop() { if (soundPool != null&&streamID!=0) soundPool.stop(streamID); } /** * 释放资源 */ public void release() { if (soundPool != null) soundPool.release(); } /** * 获取系统默认铃声的Uri * * @param context 上下文 * @return uri */ private Uri getSystemDefaultRingtoneUri(Context context) { try { return RingtoneManager.getActualDefaultRingtoneUri(context, NOW_RINGTONE_TYPE); } catch (Exception e) { return null; } } }