MediaPlayer在第一次点击时播放错误的文件

问题描述:

有人可以指出我错误的地方吗?当我按下图像按钮时,即使我没有按下相应的按钮,它也会首先播放粉红色电影。我必须按下图像按钮两次以听到正确的声音。这发生在页面第一次加载时,在第一次看起来很好但仍然不应该发生的情况之后。MediaPlayer在第一次点击时播放错误的文件

import android.content.Context; 
import android.media.MediaPlayer; 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.view.View; 
import android.widget.ImageButton; 



public class ColorPage extends AppCompatActivity { 

Context context = this; 
//MediaPlayer mpPurple, mpBlue, mpRed, mpGreen, mpYellow, mpPink; 
MediaPlayer media = null; 
//private static MediaPlayer media = null; 

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

    ImageButton pinkB = (ImageButton) findViewById(R.id.pinkButton); 
    ImageButton yellowB = (ImageButton) findViewById(R.id.yellowButton); 
    ImageButton purpleB = (ImageButton) findViewById(R.id.purpleButton); 
    ImageButton blueB = (ImageButton) findViewById(R.id.blueButton); 
    ImageButton greenB = (ImageButton) findViewById(R.id.greenButton); 
    ImageButton redB = (ImageButton) findViewById(R.id.redButton); 


    media = MediaPlayer.create(context, R.raw.purpleaudiotest); 
    purpleB.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 

      try { 
       if (media.isPlaying()) { 
        media.stop(); 
        media.release(); 
        media = MediaPlayer.create(context, R.raw.purpleaudiotest); 
       } 
       media.start(); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 
    }); 

    media = MediaPlayer.create(context, R.raw.blueaudiotest); 
    blueB.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 

      try { 
       if (media.isPlaying()) { 
        media.stop(); 
        media.release(); 
        media = MediaPlayer.create(context, R.raw.blueaudiotest); 
       } 
       media.start(); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 
    }); 

    media = MediaPlayer.create(context, R.raw.redaudiotest); 
    redB.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 

      try { 
       if (media.isPlaying()) { 
        media.stop(); 
        media.release(); 
        media = MediaPlayer.create(context, R.raw.redaudiotest); 
       } 
       media.start(); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 
    }); 

    media = MediaPlayer.create(context, R.raw.greenaudiotest); 
    greenB.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 

      try { 
       if (media.isPlaying()) { 
        media.stop(); 
        media.release(); 
        media = MediaPlayer.create(context, R.raw.greenaudiotest); 
       } 
       media.start(); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 
    }); 

    media = MediaPlayer.create(context, R.raw.yellowaudiotest); 
    yellowB.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 

      try { 
       if (media.isPlaying()) { 
        media.stop(); 
        media.release(); 
        media = MediaPlayer.create(context, R.raw.yellowaudiotest); 
       } 
       media.start(); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 
    }); 

    media = MediaPlayer.create(context, R.raw.pinkaudiotest); 
    pinkB.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 


      try { 
       if (media.isPlaying()) { 
        media.stop(); 
        media.release(); 
        media = MediaPlayer.create(context, R.raw.pinkaudiotest); 
       } 
       media.start(); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 

     } 
    }); 
} 
} 

更新:将if语句(所有这些语句)的开头更改为如下所示修复了问题。

if (media != null) { 
        media.stop(); 
        media.release(); 
        media = MediaPlayer.create(context, R.raw.pinkaudiotest); 
       } 

它始终发挥pinktestaudio因为你做

media = MediaPlayer.create(context, R.raw.pinkaudiotest); 在年底,所以media将始终与pinktestaudio初始化。 即使你点击不同的按钮,因为在每一个按钮OnClickListener你点击任何按钮第一次media.isPlaying()

if(media.isPlaying()) { 
     media.stop(); 
     media.release(); 
     media = MediaPlayer.create(context, R.raw.pinkaudiotest); 
} 

将永远是假的所以

media = MediaPlayer.create(context, R.raw.some_audio_file);

将不会被执行。 但是,当你再次点击media.isPlaying()是真实的,一切顺利。

在onCreate中创建了6个MediaPlayer实例。最后一个用于你的每个听众。

看看你的代码重构后:

public class ColorPage extends AppCompatActivity implements View.OnClickListener { 

MediaPlayer mMediaPlayer = null; 

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

    ImageButton pinkB = (ImageButton) findViewById(R.id.pinkButton); 
    ImageButton yellowB = (ImageButton) findViewById(R.id.yellowButton); 
    ImageButton purpleB = (ImageButton) findViewById(R.id.purpleButton); 
    ImageButton blueB = (ImageButton) findViewById(R.id.blueButton); 
    ImageButton greenB = (ImageButton) findViewById(R.id.greenButton); 
    ImageButton redB = (ImageButton) findViewById(R.id.redButton); 

    pinkB.setOnClickListener(this); 
    yellowB.setOnClickListener(this); 
    purpleB.setOnClickListener(this); 
    blueB.setOnClickListener(this); 
    greenB.setOnClickListener(this); 
    redB.setOnClickListener(this); 
} 

@Override 
public void onClick(View view) { 
    int audio; 

    switch (view.getId()) { 
     case R.id.pinkButton: 
      audio = R.raw.pinkaudiotest; 
      break; 
     case R.id.yellowButton: 
      audio = R.raw.yellowaudiotest; 
      break; 
     case R.id.purpleButton: 
      audio = R.raw.purpleaudiotest; 
      break; 
     case R.id.blueButton: 
      audio = R.raw.blueaudiotest; 
      break; 
     case R.id.greenButton: 
      audio = R.raw.greenaudiotest; 
      break; 
     case R.id.redButton: 
      audio = R.raw.redaudiotest; 
      break; 
     default: 
      audio = R.raw.purpleaudiotest; 
    } 

    try { 
     if (mMediaPlayer != null && mMediaPlayer.isPlaying()) { 
      mMediaPlayer.stop(); 
      mMediaPlayer.release(); 
     } 

     mMediaPlayer = MediaPlayer.create(getApplicationContext(), audio); 
     mMediaPlayer.start(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 
} 

祝你好运!

这是因为您已将media变量分配了多次并将其最后一次分配给pinkaudiotest,因此要解决您的问题,必须在事件内部分配变量media。所以只有当点击一个按钮时才会分配它。 `。 这里是你应该使用自己的相同的代码做什么:

你有SIX线看起来相似,他们都是

media = MediaPlayer.create(context, R.raw.purpleaudiotest); 

切割这些线的形式,并将其粘贴里面的onClick例如,相应的图像按钮的方法。我将为你做第一个,并重复所有SIX次。

purpleB.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     // I AM ADDING IT HERE 
    media = MediaPlayer.create(context, R.raw.purpleaudiotest); //ADDED INSIDE oClick(View view) 

     try { 
      if (media.isPlaying()) { 
       media.stop(); 
       media.release(); 
       media = MediaPlayer.create(context, R.raw.purpleaudiotest); 
      } 
      media.start(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 
}); 

重复,对于所有SIX的ImageButton和问题将不复存在。