Java 声音只能播放一次,但应播放两次

Java 声音只能播放一次,但应播放两次,java,android,Java,Android,我正在用闪存卡构建一个应用程序。当您单击“下一步”按钮时,它会播放一个声音(卡的名称),如果您单击卡,它也会播放相同的声音。唯一的问题是,当我点击“下一步”按钮时,它会同时播放两次声音,使声音听起来像机器人。我想我两次呼叫的声音是偶然的,但我不知道在哪里或如何修复它。我已经到处找了,但找不到解决办法。 这是我的密码: private String[] soundfile={"aa.m4a","bb.m4a... public void onClick(View arg0) {... //

我正在用闪存卡构建一个应用程序。当您单击“下一步”按钮时,它会播放一个声音(卡的名称),如果您单击卡,它也会播放相同的声音。唯一的问题是,当我点击“下一步”按钮时,它会同时播放两次声音,使声音听起来像机器人。我想我两次呼叫的声音是偶然的,但我不知道在哪里或如何修复它。我已经到处找了,但找不到解决办法。
这是我的密码:

 private String[] soundfile={"aa.m4a","bb.m4a...

public void onClick(View arg0) {...  
//when btnplay is clicked
    else if(arg0.getId()==R.id.imagenumber){
        //call the method playsound
        playSound(soundfile[screennumber].toString());
    }//end btnsound clicked  


//begin changeCard
private void changeCard(int screen){
    switch (screen){
        case 0:  imagenumber.setImageResource(aa);
            mediap2 = MediaPlayer.create(this, R.raw.aa);
            break;...  
mediap2.start();
}//end changeCard  


//begin playSound on click
public void playSound(String soundName){
    Boolean mpPlayingStatus;

    try{//try to check MediaPlayer status
        mpPlayingStatus=mp.isPlaying();
    }
    catch (Exception e){
        mpPlayingStatus=false;
    }
    if(mpPlayingStatus==true){//if the MediaPlayer is playing a voice, stop it to play new voice
        mp.stop();
        mp.release();//remove sound from memory
    }
    else{
        try
        {
            mp = new MediaPlayer();
            AssetFileDescriptor afd = getAssets().openFd(soundName);
            mp.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength());
            mp.prepare();
            mp.start();//play sound

        }//try block
        catch(Exception e) {
            Log.i("Error playing sound: ", e.toString());
        }
    }
}//end playSound  

谢谢你的帮助

噢,哇。我想出来了。这段时间我一直认为这完全是声音本身的问题,但事实证明问题就在这里:

if(arg0.getId()==R.id.btnprevious){
        screennumber--;//minus 1 to the screennumber
        changeNumber(screennumber);
        if(screennumber==0){
            //disable btnprevious
            btnprevious.setEnabled(false);
        }else{
            //enable btnprevious
            btnprevious.setEnabled(true);
        }
        changeNumber(screennumber);
        btnnext.setEnabled(true);
    }
在这里我调用了
changeNumber(屏幕号码);
btnnext.setEnabled(真)

两次。愚蠢的错误。无论如何,谢谢你的帮助

注意:如果它正在运行,您将停止但不会启动新声音。您正在使用
if-else
。评论还说,它确实播放了新的声音。我的问题是,当我按下按钮时,它同时在两个地方播放相同的声音。因此,我认为启动MediaPlayer有两种方法,一种是
changeCard
,另一种是
playSound
。如果您确定这些不是一起调用的,您可以使用调试器检查代码传递的位置,或者使用日志查看代码传递的位置。据我所见,这是正确的