`
abc20899
  • 浏览: 929016 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

android soundPool封装

 
阅读更多
public class AudioTool {

private static final String TAG = "UponAudio";

    private static ConcurrentHashMap<Integer, Integer> resId2SoundId = new ConcurrentHashMap<Integer, Integer>();
    private static ConcurrentHashMap<Integer, Integer> resId2StreamId = new ConcurrentHashMap<Integer, Integer>();
    private static ConcurrentHashMap<Integer, MediaPlayer> resId2Player = new ConcurrentHashMap<Integer, MediaPlayer>();

    private static SoundPool soundPool = new SoundPool(5/* 最多同时播放5个音效 */,AudioManager.STREAM_MUSIC, 0/* 默认优先级为最低 */);

    public static void preloadEffect(Context context, int resId) {
            if (!resId2SoundId.containsKey(resId)) {
                    int soundId = soundPool.load(context, resId, 0);
                    if (soundId > 0) {
                            resId2SoundId.put(resId, soundId);
                    } else {
                            Log.d(TAG, "preload effect " + resId + " failed");
                    }
            }
    }

    public static void playEffect(Context context, int resId) {
            if (!resId2SoundId.containsKey(resId)) {// 未load
                    int soundId = soundPool.load(context, resId, 0);
                    if (soundId > 0) {
                            resId2SoundId.put(resId, soundId);
                    } else {
                            Log.d(TAG, "load effect " + resId + " failed");
                    }
            }
            int streamId = soundPool.play(resId2SoundId.get(resId), 1.0f, 1.0f, 0, 0, 1.0f);
            if (streamId > 0) {// play successful
                    resId2StreamId.put(resId, streamId);
            } else {// play failed
                    Log.d(TAG, "play effect " + resId + " failed");
            }
    }

    /**
     * @param resId
     */
    public static void pauseEffect(int resId) {
            if (!resId2StreamId.containsKey(resId)) {// 并未播放
                    return;
            }
            soundPool.pause(resId2StreamId.get(resId));
    }

    /**
     * @param resId
     */
    public static void stopEffect(int resId) {
            if (!resId2StreamId.containsKey(resId)) {
                    return;
            }
            soundPool.stop(resId2StreamId.get(resId));
    }

    /**
     * @param resId
     */
    public static void unloadEffect(int resId) {
            if (!resId2SoundId.containsKey(resId)) {
                    return;
            }
            soundPool.unload(resId2SoundId.get(resId));
            resId2SoundId.remove(resId);
            resId2StreamId.remove(resId);
    }

    /**
     * 释放所有资源,在程序退出是调用
     */
    public static void release() {
            soundPool.release();
            resId2SoundId.clear();
            resId2StreamId.clear();
            if (resId2Player.size() > 0) {
                    for (Map.Entry<Integer, MediaPlayer> entry : resId2Player.entrySet()) {
                            if (entry.getValue() != null) {
                                    entry.getValue().release();
                            }
                    }
            }
            resId2Player.clear();
    }

    /**
     * @param resId  播放背景音效
     */
    public static void playBkgMusicSync(final Context context, final int resId) {
            if (resId2Player.containsKey(resId)) {
                    MediaPlayer player = resId2Player.get(resId);
                    if (!player.isPlaying()) {// 如果是stop状态,即进入ErrorListener处理
                            player.start();
                    }
            } else {
                    final MediaPlayer player = MediaPlayer.create(context, resId);
                    if (player != null) {
                            resId2Player.put(resId, player);// 添加到map中
                            player.setAudioStreamType(AudioManager.STREAM_MUSIC);
                            player.setLooping(true);
                            int volume = ((AudioManager) context.getSystemService(Context.AUDIO_SERVICE))
                                            .getStreamVolume(AudioManager.STREAM_MUSIC);
                            player.setVolume(volume, volume);
                            player.setOnErrorListener(new OnErrorListener() {
                                    @Override
                                    public boolean onError(MediaPlayer mp, int what, int extra) {
                                            mp.release();
                                            resId2Player.remove(resId);
                                            return true;
                                    }
                            });
                            player.start();
                    }
            }
    }

    /**
     * @param resId     
     */
    public static void playBkgMusicAsync(final Context context, final int resId) {
            if (resId2Player.containsKey(resId)) {
                    MediaPlayer player = resId2Player.get(resId);
                    if (!player.isPlaying()) {// 如果是stop状态,即进入ErrorListener处理
                            player.start();
                    }
            } else {
                    final MediaPlayer mp = new MediaPlayer();
                    try {
                            AssetFileDescriptor afd = context.getResources().openRawResourceFd(resId);
                            if (afd == null) {
                                    Log.d(TAG, "can not open raw resource " + resId);
                                    return;
                            }

                            mp.setAudioStreamType(AudioManager.STREAM_MUSIC);
                            mp.setLooping(true);
                            int volume = ((AudioManager) context.getSystemService(Context.AUDIO_SERVICE))
                                            .getStreamVolume(AudioManager.STREAM_MUSIC);
                            mp.setVolume(volume, volume);

                            mp.setOnPreparedListener(new OnPreparedListener() {
                                    @Override
                                    public void onPrepared(MediaPlayer mp) {
                                            Log.d(TAG, "background music " + resId + " prepared");
                                            resId2Player.put(resId, mp);// 添加到map中
                                            mp.start();
                                    }
                            });

                            mp.setOnErrorListener(new OnErrorListener() {
                                    @Override
                                    public boolean onError(MediaPlayer mp, int what, int extra) {
                                            mp.release();
                                            resId2Player.remove(resId);
                                            return true;
                                    }
                            });
                            mp.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength());
                            afd.close();
                            mp.prepareAsync();
                    } catch (IOException ex) {
                            Log.d(TAG, "create failed:", ex);
                    } catch (IllegalArgumentException ex) {
                            Log.d(TAG, "create failed:", ex);
                    } catch (SecurityException ex) {
                            Log.d(TAG, "create failed:", ex);
                    }
            }
    }

    public static void pauseBkgMusic(int resId) {
            if (resId2Player.containsKey(resId)) {
                    MediaPlayer mp = resId2Player.get(resId);
                    if (mp.isPlaying()) {
                            mp.pause();
                    }
            }
    }

    public static void stopBkgMusic(int resId) {
            if (resId2Player.containsKey(resId)) {
                    MediaPlayer mp = resId2Player.get(resId);
                    mp.stop();
            }
    }

    public static void releaseBkgMusic(int resId) {
            if (resId2Player.containsKey(resId2Player)) {
                    MediaPlayer mp = resId2Player.get(resId);
                    if (mp != null) {
                            mp.release();
                            resId2Player.remove(resId);
                            mp = null;
                    }
            }
    }
}
分享到:
评论

相关推荐

    SoundPool封装类

    资源为一个专门处理短音效soundPool的工具类,使用起来很方便,封装的很好!使用方法: 1、你只需要在需要的地方调用这个方法进行类初始化 private void initSound() { soundPlay = new SoundPlay(); soundPlay....

    android类库的详细介绍

    多媒体是现代应用的关键特性之一,`android.media`类库提供了AudioManager、MediaPlayer和SoundPool等类,用于音频和视频的播放、录制和管理。通过这些API,开发者可以轻松集成音乐播放器、录音功能和游戏音效。 ##...

    android 播放声音视频几种方法

    2. **使用VideoView**:`VideoView`是Android提供的一种更便捷的方式,它封装了`MediaPlayer`,并可以直接设置布局参数,方便在界面上显示视频。 ```java VideoView videoView = findViewById(R.id.video_view); ...

    Android开发与应用——张荣,原书配套课件

    9.1.2 SoundPool 9.1.3 VideoView 9.1.4 SurfaceView 9.2 摄像头的使用 9.2.1 摄像头意图Intent 9.2.2 Camera类 9.3 小结 练习 实验一 Android开发环境搭建 实验二 界面设计:基本组件 实验三 界面...

    从零开始Android游戏编程

    了解基本的面向对象编程概念,如类、对象、继承、封装和多态,是开始Android开发的必备知识。 接着,你需要掌握Android Studio,这是一个强大的集成开发环境(IDE),它提供了许多便利的工具,如代码编辑器、调试器...

    android-game.rar_AndroidGame开发_android_游戏编程案例

    Android SDK提供MediaPlayer和SoundPool类来播放音效和背景音乐。开发者应学会如何加载、控制和管理音频资源。 此外,Android游戏还需要考虑性能优化,因为移动设备的硬件资源有限。这包括减少内存占用、优化渲染...

    Android 4游戏入门经典(第3版) 随书源码

    Android提供了MediaPlayer和SoundPool类来播放背景音乐和音效。此外,了解如何使用OpenSL ES进行低级音频处理,可以实现更复杂的音频特效。 除此之外,游戏的输入控制、游戏状态管理、网络通信(如多人在线游戏)、...

    android audio system

    此外,日志中还提到了HwModule类,这是音频HAL(硬件抽象层)的一部分,用于封装硬件的具体实现,以便于上层软件使用。HwModule包含输入和输出配置文件,以及一些控制输入输出设备的逻辑。 最后,日志中提到了`...

    安卓Android源码——翻翻乐--抢答--转盘.zip

    - MediaPlayer和SoundPool:Android提供了多媒体播放组件,用于播放游戏音效或背景音乐。 9. **资源管理**: - 资源文件(如图片、音频、字符串等)通常存放在res目录下,根据不同的设备配置进行适配。 10. **...

    Android移动应用开发基础教程第6章.pptx

    在 API 21 (Android 5.0) 之后的版本中,SoundPool() 构造方法已经过时了,需用 SoundPool.Builder 来创建 SoundPool 对象。SoundPool.Builder 对象可执行 setMaxStreams() 方法设置 SoundPool 对象中可加载的最大...

    Android实现《快乐数独》视频教程(附PPT+源码)

    Android SDK提供了MediaPlayer和SoundPool类来播放音频,以及动画框架来实现过渡效果,例如单元格选中时的高亮动画。 6. **PPT和源码**:教程附带的PPT将详细讲解上述各个步骤,帮助学习者理解概念并进行实践。源码...

    [Android游戏源码]-捏苍蝇

    Android提供了MediaPlayer和SoundPool类用于处理音频播放。 10. **性能优化**:为了保证游戏流畅运行,开发者可能需要对游戏进行性能优化,如减少不必要的渲染,使用高效的算法,或者合理地使用线程。 通过研究这...

    ANDROID_2.0游戏开发实战宝典电子书.rar

    对于音频,Android提供了MediaPlayer和SoundPool两个类,分别适用于背景音乐和短小音效的播放。 性能优化是Android游戏开发中不可忽视的一环。开发者需要关注内存管理和CPU使用,避免内存泄漏,合理使用异步任务和...

    中国象棋源码(Android).zip

    9. **多媒体支持**: 如果应用包含音效或动画,开发者需要了解如何处理Android的音频和图像资源,可能涉及MediaPlayer或SoundPool类,以及动画框架如ObjectAnimator或ValueAnimator。 10. **游戏逻辑**: 中国象棋的...

    Android游戏——飞行射击游戏1945最简单实现源码

    Android的MotionEvent类封装了触摸事件的信息,我们可以监听ACTION_DOWN(手指按下)、ACTION_UP(手指抬起)等事件,来控制玩家飞机的移动和射击。 除此之外,为了增加游戏性,还需要设计一套得分系统和生命值管理...

    Android程序研发源码Android 计算器源码.rar

    - 高级的计算器应用可能还包括按键音效,这需要用到Android的音频管理API,如`MediaPlayer`或`SoundPool`。 9. **样式和主题**: - 可能包含自定义主题和样式,以改变计算器的视觉外观,这部分代码可能在`res/...

    android 打地鼠游戏

    - 集成Android的MediaPlayer或SoundPool播放音效,如地鼠被打中的声音和时间到的声音。 7. **多线程**: - 为了保证游戏流畅性,与用户交互相关的部分(如事件处理)应运行在主线程,而耗时操作(如动画、计时器...

    Android应用源码之俄罗斯方块游戏源码.zip

    Android的MediaPlayer或SoundPool类可以用于播放音频资源。 8. **分数系统**:根据消除的行数,游戏会计算并更新分数。这涉及到简单的数学运算,以及分数显示控件的更新。 9. **游戏结束条件**:当方块堆积到顶部...

    Android 2.0游戏开发实战宝典第5章源码,

    9. **音效与音乐播放**:Android提供MediaPlayer类用于播放音频,但针对游戏,可能需要使用更专业的库如OpenAL或SoundPool来实现音效即时播放和音量控制。 10. **保存与加载游戏进度**:游戏可能需要实现保存和加载...

    3D猫Android

    而SoundPoolMap可能是对SoundPool的进一步封装,它可能包含了一种映射机制,将特定的动作或事件与预先加载的音频文件关联起来,这样当事件发生时,对应的音频就能即时播放。 在实现3D猫Android项目时,开发者首先...

Global site tag (gtag.js) - Google Analytics