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 this1
      图片来自2013年的一部电影,自己截图,有人能猜到是什么名字吗?

    • 无意中找到我的一张照片2

    很好的展示出兴趣和爱,才是人类进步和发展的源泉。

    我因为兴趣而摄影,她因为爱情而陪伴

    正如《一代宗师》所说:世间所有的相遇,都是久别重逢。心之切切,情之拳拳,早已尽收眼底。

    希望明天我会更帅。

    -------------The End-------------
    请我喝一杯啤酒~