Android游戏音效和音乐的实现

前言

对于使用过Android系统的人来说,打开图库App就能看见手机里面所有的图片,打开音乐App就听到所有的音乐,而且这个过程不是很慢。以前没有深入的去思考这个事情,直到最近看了些别人的代码查了查API才觉得原来这么简单。就是利用MediaStore类。

MediaStore

什么是MediaStore?官方的API给了详细的描述和解释。 其中包含了三个内部类: * MediaStore.Audio * MediaStore.Image * MediaStore.Video 从名字就可以看出来分别对应的是音频,图片和视频。这三个内部类又有好多的内部类,详情可以看文档。 通过ContentProvider的数据共享机制,将多媒体文件共享出来,以便其他的应用程序可以使用。 但是套用在我的小程序里面,我觉得还是有点大题小做,所以,我得尝试着用用我上篇文章中,背景音乐和音效中说的方法试试看。

如何来构建这样一个Unity

第一反应肯定是利用Java的封装特性,将我们需要的功能给封装出合适的接口,同时能方便我们很好的调用。
  • 利用AudioManager的实例化对象来获取系统当前的声音对象。
    AudioManager audiomanage = (AudioManager)context.getSystemService(Context.AUDIO_SERVICE);
  • 通过设置标志位来控制音乐和音效
    // 媒体播放控制开关 private static boolean musicRunning = true; // 声音池播放开关 private static boolean soundRunning = true;
  • 需要注意的是,Soundpool存放的是键值对,因此我们需要将其定义成Map型
    // 声音池键值对 声音资源ID与 private static Map<Integer, Integer> soundPoolMap; // 音乐资源ID数组 private static final int musicId[] = { R.raw.backgroung };
  • 接下来进行初始化,同时获取上下文对象
    // 初始化资源 public static void init(Context context) { mContext = context; initMusic(); initSoundPool(); } // 初始化music public static void initMusic() { mMediaPlayer = MediaPlayer.create(mContext, musicId[0]); mMediaPlayer.setLooping(true); } // 初始化音效池 public static void initSoundPool() { mgr = (AudioManager) mContext.getSystemService(Context.AUDIOSERVICE); soundPool = new SoundPool(10, AudioManager.STREAMMUSIC, 100); soundPoolMap = new HashMap<Integer, Integer>(); soundPoolMap.put(R.raw.btns, soundPool.load(mContext, R.raw.btns, 1)); }
  • 最后在各自的函数里,写好相应的调用函数就ok了。MediaPlayer的调用方法及其流程,上篇文章中,背景音乐和音效中我也写过了,忘记的可以再去看看。主要就写写Soundpool的调用方法,由于它是短音效,是在按键或者其他条件达成时候才进行播放,所以不用设置暂停和停止
public static void PlaySoundPool(int resid) {
    if (soundRunning == false) {  
        return;  
    }
    Integer soundId = soundPoolMap.get(resid);
    if (soundId != null && soundRunning) {
        soundPool
                .play(soundId,
                        mgr.getStreamMaxVolume(AudioManager.STREAM_MUSIC),
                        mgr.getStreamMaxVolume(AudioManager.STREAM_MUSIC),
                        1, 0, 1f);
        System.out.println("1--->" + resid);
    }
}
最后就是,留出适合你的API,供你的程序调用就好了。
下文与技术无关,技术人员可以Ctrl+w了。
  • 今天确定好了毕业设计的任务书,紧接着而来的就是为期3个月的毕业设计。每天四次签到加一篇毕业设计报告,累也罢苦也罢,都是一种经历,何况这样的结束,也不枉来到大学为了计算机奋斗四年。
  • 若有闲时间,我希望能在我再开设一个电影专栏,写写我对于深爱的每一部影片的见解,以及那些深深打动我的镜头。like this: 图片来自2013年的一部电影,自己截图,有人能猜到是什么名字吗?
  • 无意中找到我的一张照片 很好的展示出兴趣和爱,才是人类进步和发展的源泉。
我因为兴趣而摄影,她因为爱情而陪伴 正如《一代宗师》所说:世间所有的相遇,都是久别重逢。心之切切,情之拳拳,早已尽收眼底。 希望明天我会更帅。