前言:因为系统对Android通知栏的音频控制,导致系统通知音没有办法出现,所以在通知栏出现的时候调用SoundPool进行音频播放。音频源已经写死,具体使用者根据情况对代码进行改动
使用方式如下:

播放:SoundPoolUtils.getInstance(this).playMayWait();销毁:SoundPoolUtils.getInstance(this).releaseSoundPool();

源代码如下:

package com.dq.im.util;import android.content.Context;import android.media.AudioAttributes;import android.media.AudioManager;import android.media.SoundPool;import com.dq.im.R;/** * 提示音播放工具类 * */public class SoundPoolUtils implements SoundPool.OnLoadCompleteListener {    private static final int DEFAULT_INVALID_SOUND_ID = -Integer.MAX_VALUE;    private static final int DEFAULT_INVALID_STREAM_ID = -Integer.MAX_VALUE;    private int mSoundId = DEFAULT_INVALID_SOUND_ID;    private int mStreamID = DEFAULT_INVALID_STREAM_ID;    private float mCruLeftVolume = 1.0f;    private float mCurRightVolume = 1.0f; // 用于设置sound pool的左右volume值 0~1f    private SoundPool mSoundPool;    private static SoundPoolUtils soundPoolUtils;    private Context context;    private SoundPoolUtils(Context context) {        this.context = context;    }    public static SoundPoolUtils getInstance(Context context){        if (null == soundPoolUtils){            soundPoolUtils = new SoundPoolUtils(context);        }        return soundPoolUtils;    }    /**     * 播放:如果资源还没有加载,则可能会有一小段等待时间     */    public void playMayWait() {        releaseSoundPool();        createSoundPoolIfNeeded();        if (mSoundId == DEFAULT_INVALID_SOUND_ID) {  // mSoundId is invalid ,load from res raw for once before mSoundPool is released            mSoundId = mSoundPool.load(context, R.raw.notification, 1); // 加载音频资源        } else {            // reuse the loaded res            if (mStreamID == DEFAULT_INVALID_STREAM_ID)                onLoadComplete(mSoundPool, 0, 0);  // manually call this method when there is a valid mSoundId        }    }    /**     * 创建SoundPool     */    private void createSoundPoolIfNeeded() {        if (mSoundPool == null) {            // 5.0 及 之后            if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) {                AudioAttributes audioAttributes = null;                audioAttributes = new AudioAttributes.Builder()                        .setUsage(AudioAttributes.USAGE_MEDIA)                        .setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION)                        .build();                mSoundPool = new SoundPool.Builder()                        .setMaxStreams(16)                        .setAudioAttributes(audioAttributes)                        .build();            } else { // 5.0 以前                mSoundPool = new SoundPool(16, AudioManager.STREAM_MUSIC, 0);  // 创建SoundPool            }            mSoundPool.setOnLoadCompleteListener(this);  // 设置加载完成监听        }    }    /**     * 释放资源     */    public void releaseSoundPool() {        if (mSoundPool != null) {            mSoundPool.autoPause();            mSoundPool.unload(mSoundId);            mSoundId = DEFAULT_INVALID_SOUND_ID;            mStreamID = DEFAULT_INVALID_STREAM_ID;            mSoundPool.release();            mSoundPool = null;        }    }    @Override    public void onLoadComplete(SoundPool soundPool, int sampleId, int status) {        if (mSoundPool != null) {            if (mStreamID == DEFAULT_INVALID_STREAM_ID)                mStreamID = mSoundPool.play(mSoundId, mCruLeftVolume, mCurRightVolume, 16, 1, 1.0f);        }    }}

更多相关文章

  1. Android(安卓)P SystemUI之StatusBar UI布局status_bar.xml解析
  2. Android--SoLoader,android动态加载so库
  3. Android(安卓)Audio Focus的应用(requestAudioFocus)
  4. Android异步加载图像小结 (含线程池,缓存方法)
  5. Android(安卓)Paging组件Demo
  6. Android(安卓)TabHost使用、动态加载内容
  7. 在android中policymanager
  8. Android(安卓)主流图片库Picasso Glide Fresco对比分析
  9. 你真的了解你手机的状态栏吗?

随机推荐

  1. Androidstudio开发button按钮的操作以及
  2. Android(安卓)游戏开发基础
  3. Android(安卓)APIDemos 研读之一:android.
  4. Android(安卓)Handler 异步消息处理机制
  5. Activity Task 与 Intent Filter Flag
  6. Android(安卓)实现QQ第三方登录
  7. Android使用adb命令直接修改文件
  8. Android(安卓)Binder
  9. Android(安卓)no such table (找不到表)
  10. Windows XP下Android开发环境搭建(二)