我正在制作一个新的Android声音应用程序。当我点击它时,我做了一个可点击的按钮来播放声音。但我也希望它在第二次点击时停止播放声音。那部分工作正常现在这是问题,当我再次点击按钮再次播放声音时,它不播放它,媒体播放器完全停止。我在论坛上看,但我似乎找不到可以帮助我的答案。 这是我的活动:
MediaPlayer mpButtonClick1;
MediaPlayer mpButtonClick2;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.prvi);
final MediaPlayer mpButtonClick1 = MediaPlayer.create(this, R.raw.spalshm);
final MediaPlayer mpButtonClick2 = MediaPlayer.create(this, R.raw.splashs);
Button dugme = (Button) findViewById(R.id.dugme);
dugme.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (mpButtonClick1.isPlaying()) {
mpButtonClick1.stop();
mpButtonClick1.reset();
}
else {
mpButtonClick1.start();
}
}
});
当我尝试编写mpButtonClick1.prepare();我收到错误未处理的异常类型IOE异常
答案 0 :(得分:10)
尝试使用pause
代替stop
。
原因:如果您暂停MediaPlayer
,则可以稍后恢复。但是,如果您使用stop
,几乎任何其他方法都将无效,您将不得不再次准备MediaPlayer(或创建一个新方法)。
PS:完成资源使用后不要忘记释放内存。
答案 1 :(得分:8)
试试这个: 您应该只使用一个媒体播放器对象
public class PlayaudioActivity extends Activity {
private MediaPlayer mp;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button b = (Button) findViewById(R.id.button1);
Button b2 = (Button) findViewById(R.id.button2);
final TextView t = (TextView) findViewById(R.id.textView1);
b.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
stopPlaying();
mp = MediaPlayer.create(PlayaudioActivity.this, R.raw.far);
mp.start();
}
});
b2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
stopPlaying();
mp = MediaPlayer.create(PlayaudioActivity.this, R.raw.beet);
mp.start();
}
});
}
private void stopPlaying() {
if (mp != null) {
mp.stop();
mp.release();
mp = null;
}
}
}
答案 2 :(得分:3)
使用以下代码更改您的课程:
删除reset();
。
初始化所有组件:
MediaPlayer mpButtonClick1;
MediaPlayer mpButtonClick2;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.prvi);
mpButtonClick1 = MediaPlayer.create(this, R.raw.spalshm);
mpButtonClick2 = MediaPlayer.create(this, R.raw.splashs);
Button dugme = (Button) findViewById(R.id.dugme);
dugme.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (mpButtonClick1.isPlaying()) {
mpButtonClick1.stop();
}
else {
mpButtonClick1.start();
}
}
});
答案 3 :(得分:0)
你在mpButtonClick1.stop()之后调用mpButtonClick1.reset() - 不要这样做:
if (mpButtonClick1.isPlaying()) {
mpButtonClick1.stop();
mpButtonClick1.reset(); //<--------- calling reset(), remove this line
}
reset()的文档说:
将MediaPlayer重置为未初始化状态。调用此方法后,您必须通过设置数据源并调用prepare()来重新初始化它。
删除mpButtonClick1.reset(),它应该可以工作。
请记住,MediaPlayer可以作为状态机运行,这意味着如果以错误的顺序调用方法,您将遇到问题。请阅读有关MediaPlayer here和here的信息。
答案 4 :(得分:0)
根据我的经验,当我需要多次播放时,我可能需要停止一场比赛才能开始另一场比赛(就像多个按钮一样),我只是创建另一个播放器,确保我释放资源前一个。停止使用
mediaPlayer.stop();
但是对于游戏来说,请使用类似的东西(根据您的特定需求调整日志)来创建/重新创建您的播放器:
private boolean createMediaPlayer()
{
if (mediaPlayer!=null)
{
if(mediaPlayer.isPlaying())
{
mediaPlayer.stop();
mediaPlayer.reset();
mediaPlayer.release();
mediaPlayer=null;
}
}
mediaPlayer = new MediaPlayer();
mediaPlayer.setVolume(1f, 1f);
try
{
mediaPlayer.setAudioStreamType(Interop.PRIMARY_STREAM);
mediaPlayer.setDataSource(m_soundFile);
mediaPlayer.prepare();
return true;
// Interop.logDebug(TAG + "-loadAudio: SUCCESS" + m_soundFile);
} catch (Exception e)
{
Interop.logError(TAG + "-LoadAudio for Clic Sound: audioPlayer prepare failed for current file: " + m_soundFile);
Interop.logError(TAG + "-Exception: " , e);
return false;
}
}
而不是使用
if (createMediaPlayer())
mediaPlayer.start();
这将确保正确释放媒体播放器使用的资源。
答案 5 :(得分:0)
一个简单的解决方案是使用暂停而不是停止和寻找歌曲的开头。
答案 6 :(得分:0)
我知道这个问题已经很老了,但是最近在学习Android时,我也陷入了困境,并找到了一个非常简单的解决方案,希望与大家分享。
您可以后退回到开始位置,而不是尝试停止或重置
mediaPlayer.seekTo(0);
作为参考,我也在下面发布了我的代码:
public class MainActivity extends AppCompatActivity {
MediaPlayer mp;
public void play(View view) {
mp.start();
}
public void pause(View view) {
mp.pause();
}
public void stop(View view) {
// this seeks to the beginning of the file
mp.seekTo(0);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mp = MediaPlayer.create(this, R.raw.sample_audio);
}
}
答案 7 :(得分:0)
嘿,请使用以下
停止->媒体播放器
mp.seekTo(0);
mp.pause();
开始通话 mp.start();
答案 8 :(得分:-1)
无论播放与否,我都使用此代码从头开始播放声音。
mp.seekTo(0);
mp.start();