Android 按钮点击声音媒体播放器崩溃,如果按钮按下过快

Android 按钮点击声音媒体播放器崩溃,如果按钮按下过快,android,button,audio,android-mediaplayer,assets,Android,Button,Audio,Android Mediaplayer,Assets,类似的问题被问了很多次,我也看到了其他的答案。他们说,为了在每次单击按钮时播放声音(在本例中为“tock.wav”,位于资产文件夹中),您应该执行以下操作: public void onClick(View button) { playButtonClickSound(); } private void playButtonClickSound() { if (mMediaPlayer.isPlaying()) { mMediaPlayer.stop();

类似的问题被问了很多次,我也看到了其他的答案。他们说,为了在每次单击按钮时播放声音(在本例中为“tock.wav”,位于资产文件夹中),您应该执行以下操作:

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();
    }
}
这是有道理的,对吗?这似乎是个好办法。问题是,这是有效的,除非用户在彼此之后很快按下按钮。然后在某个时刻,声音停止播放。如果你等几分钟再试一次,它会再次播放。当然这不是我想要的。按钮点击的声音应该总是有效的,而不仅仅是当用户点击的速度不是太快的时候

那么有人知道是什么导致了这种情况吗?

试着用这个

MediaPlayer mediaPlayer = MediaPlayer.create(context, R.raw.sound_file_1);
mediaPlayer.start(); // no need to call prepare(); create() does that for you
试着用这个

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

禁用按钮onClick()这是什么意思?@Zero我有两个建议。1) 删除
if
块,只需调用
mmediplayer.reset()
。它应该是合法的,在任何时候这样做,并停止作为一个副作用的球员。2) 获取单击处理程序外部的文件描述符。访问该文件可能是该方法的瓶颈。-如果这不起作用,我有另一个可能的解决方案。禁用按钮onClick(),这是什么意思?@Zero我建议两件事。1) 删除
if
块,只需调用
mmediplayer.reset()
。它应该是合法的,在任何时候这样做,并停止作为一个副作用的球员。2) 获取单击处理程序外部的文件描述符。访问该文件可能是该方法的瓶颈。-如果这不起作用,我有另一个可能的解决方案。您想在每次用户单击时从开始播放声音吗。。。。或者,您希望先完成当前声音,然后播放下一个声音,这与用户单击有关。是否希望每次用户单击…,都从开始播放声音。。。。或者,您希望先完成当前声音,然后播放下一个声音,以防用户单击