每次单击时如何获得重复声音的按钮?

时间:2013-12-22 15:50:28

标签: java android

当我按下按钮时它会播放声音很好但是当我再次点击它时没有任何反应。 我想让它在每次点击时重复声音?任何想法??

谢谢你的期待。 : - )

package com.example.sherlock;

import java.io.IOException;

import android.app.Activity;
import android.content.res.AssetFileDescriptor;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class Conent extends Activity  {



    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.content);

        final MediaPlayer mp = new MediaPlayer();
        Button b = (Button) findViewById(R.id.button1); 

        final MediaPlayer mp1 = new MediaPlayer();
        Button c = (Button) findViewById(R.id.Button2); 


        b.setOnClickListener(new OnClickListener() {

            public void onClick(View v) {

                if(mp.isPlaying())
                {  
                    mp.stop();
                    mp.reset();

                } 
                try {

                    AssetFileDescriptor afd;
                    afd = getAssets().openFd("s1.mp3");
                    mp.setDataSource(afd.getFileDescriptor(),afd.getStartOffset(),afd.getLength());
                    mp.prepare();
                    mp.start();
                } catch (IllegalStateException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                }



            }
        });

        c.setOnClickListener(new OnClickListener() {

            public void onClick(View v) {

                if(mp1.isPlaying())
                {  
                    mp1.stop();
                    mp1.reset();
                } 
                try {

                    AssetFileDescriptor afd;
                    afd = getAssets().openFd("s2.mp3");
                    mp1.setDataSource(afd.getFileDescriptor(),afd.getStartOffset(),afd.getLength());
                    mp1.prepare();
                    mp1.start();
                } catch (IllegalStateException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                }



            }
        });





}

}

4 个答案:

答案 0 :(得分:2)

   private SoundPool sp;
private int music;
sp= new SoundPool(10, AudioManager.STREAM_SYSTEM, 5);//the first param is times of play music                                at the same time
music = sp.load(this, R.raw.start, 1);//start is source music
        mButton01.setOnClickListener(new OnClickListener(){   
            @Override   
           public void onClick(View v) {   
             sp.play(music, 1, 1, 0, 0, 1);   
       }  
    }

也许您可以将*.mp3更改为*.ogg

答案 1 :(得分:1)

不要重置你的mp而是设置一个mp.oncompletelistener并在里面

public void onCompletion(MediaPlayer mp) {

//set the datasource again}

答案 2 :(得分:1)

让我们说MediaPlayer“不喜欢”在播放时被中断,如果你在播放声音时单击按钮,那么你的例子中可能会出现这种情况。

我认为你可以从它的位置剪切.reset()方法并将它粘贴到你的try bloc中的setDataSource之前:

mp.reset();
mp.setDataSource(MEDIA_PATH);
mp.prepare();
mp.start();

它可能会解决您的问题,但请记住,reset()和prepare()都是异步方法,因此依赖于MediaPlayer足够响应以在您的用例中处理它们可能是好的,但不是一个好的做法。

我会在你的情况下使用SoundPool,而不是使用MediaPlayer。看起来你不会播放长音(音乐等),你的声音可能重叠。对于这种情况,SoundPool更可靠,更快捷。

我还在堆栈溢出上发现了类似的线程,希望它能帮到你一点 - How to Play sound when button is clicked in Android?,请看Jan S回答。

答案 3 :(得分:1)

如果按下Click按钮

,您只需将它们放在您的下方
  try{        
  mp.start();         
  }
    catch(Exception e){}
  }

  try{        
  mp1.start();         
  }
    catch(Exception e){}
  }