2013-12-14 40 views
1

这个问题的类似问题很多,我已经看过其他答案。他们说的是,为了播放声音(在这种情况下,“tock.wav”,它位于assets文件夹),只要点击一个按钮,你应该做到以下几点:按钮声音MediaPlayer崩溃如果按钮太快按

public void onClick(View button) { 
    playButtonClickSound(); 
} 

private void playButtonClickSound() { 
    if (mMediaPlayer.isPlaying()) { 
     mMediaPlayer.stop(); 
     mMediaPlayer.reset(); 
    } 

    try { 
     AssetFileDescriptor afd; 
     afd = getAssets().openFd("tock.wav"); 
     mMediaPlayer.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength()); 
     mMediaPlayer.prepare(); 
     mMediaPlayer.start(); 
    } catch (IllegalStateException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

这理解正确吗?这似乎是一个好方法。事情是这样的,除非用户非常快速地按下按钮(s)。然后在某个时候,声音停止播放。如果您等待几分钟再试一次,它会再次播放。当然这不是我想要的。按钮点击声音应该始终有效,而不仅仅是用户没有点击太快。

那么,有没有人有一个想法,究竟是什么造成了这种情况?

+0

禁用按钮的onClick() – Carbon

+0

你是什么意思呢? – Zero

+0

@零我会建议两件事。 1)删除'if'块,只需调用'mMediaPlayer.reset()'。任何时候都应该合法,并且阻止球员作为副作用。 2)获得点击处理程序之外的文件描述符。访问该文件可能是该方法的瓶颈。 - 如果这不起作用,我有另一种可能的解决方案。 – Dave

回答

1

尝试使用此

MediaPlayer mediaPlayer = MediaPlayer.create(context, R.raw.sound_file_1); 
mediaPlayer.start(); // no need to call prepare(); create() does that for you 
+0

这就是我之前做的,同样的问题.. – Zero

+0

你想每次用户点击时播放声音吗?或者你想先完成当前的声音,然后播放下一个声音,无论用户点击 –