按下按钮时如何播放音频(如木琴)

时间:2014-05-27 15:25:04

标签: android button android-mediaplayer

我正在开发一个应用程序,每次按下按钮时应该发出声音,应用程序看起来像木琴,问题在于播放声音的功能。

这是我的应用程序的主要部分:

 doo = (Button) findViewById(R.id.doo);
  re = (Button) findViewById(R.id.re);
  mi = (Button) findViewById(R.id.mi);  
  fa = (Button) findViewById(R.id.fa);  
  sol = (Button) findViewById(R.id.sol);  
  la = (Button) findViewById(R.id.la);  
  si = (Button) findViewById(R.id.si);  
  dom = (Button) findViewById(R.id.dom);

  doo.setOnClickListener(new OnClickListener(){
   public void onClick(View v) {
    MediaPlayer sound;
    sound = MediaPlayer.create(Xylophone.this, R.raw.doo);
    sound.start();
   }
  });

  re.setOnClickListener(new OnClickListener(){
   public void onClick(View v) {
    MediaPlayer sound;
    sound = MediaPlayer.create(Xylophone.this, R.raw.re);
    sound.start();
   }
  });  

  mi.setOnClickListener(new OnClickListener(){
   public void onClick(View v) {
    MediaPlayer sound;
    sound = MediaPlayer.create(Xylophone.this, R.raw.mi);
    sound.start();
   }
  }); 

  fa.setOnClickListener(new OnClickListener(){
   public void onClick(View v) {
    MediaPlayer sound;
    sound = MediaPlayer.create(Xylophone.this, R.raw.fa);
    sound.start();
   }
  }); 

  sol.setOnClickListener(new OnClickListener(){
  public void onClick(View v) {
   MediaPlayer sound;
   sound = MediaPlayer.create(Xylophone.this, R.raw.sol);
   sound.start();
  }
 }); 
  la.setOnClickListener(new OnClickListener(){
  public void onClick(View v) {
   MediaPlayer sound;
   sound = MediaPlayer.create(Xylophone.this, R.raw.la);
   sound.start();
  }
 }); 

  si.setOnClickListener(new OnClickListener(){
  public void onClick(View v) {
   MediaPlayer sound;
   sound = MediaPlayer.create(Xylophone.this, R.raw.si);
   sound.start();

  }
 }); 

  dom.setOnClickListener(new OnClickListener(){
  public void onClick(View v) {
   MediaPlayer sound;
   sound = MediaPlayer.create(Xylophone.this, R.raw.dom);
   sound.start();
  }
 }); 

最初播放的声音没有问题,但是在屏幕上的一定数量的敲击声不再有任何声音后,我不得不重新启动应用程序以使其再次运行。

谁能告诉我为什么?

修改

我解决了用以下代码替换代码的问题:

doo.setOnClickListener(new OnClickListener(){
   public void onClick(View v) {
      final MediaPlayer sound;
       sound = MediaPlayer.create(Xylophone.this, R.raw.doo);
       sound.setOnCompletionListener(new OnCompletionListener() {

           public void onCompletion(MediaPlayer mp) {
            sound.release();
           }

       });   
       sound.start();
   }
  });

我希望这个编辑可以帮助某人:)

2 个答案:

答案 0 :(得分:0)

您正在创建一个新的MediaPlayer实例来播放每个声音。 MediaPlayers是资源密集型的,当以这种方式使用时会引起问题。您应该重复使用它们或清理它们。

来自documentation of the MediaPlayer.create()方法:

  

完成MediaPlayer后,您应该调用release()来释放   资源。如果没有发布,将导致过多的MediaPlayer实例   在一个例外中。

答案 1 :(得分:0)

编写代码的方式,每次按下按钮时都会创建一个新的MediaPlayer对象。随着时间的推移,您的手机将耗尽内存。

尝试在按钮定义后创建8个声音并且只有      dooSound.start(); 在单击侦听器中。 检查MediaPlayer文档以确保正确处理对象生命周期。