【问题标题】:Android MediaPlayer - Play sound twice while not finishedAndroid MediaPlayer - 未完成时播放两次声音
【发布时间】:2016-01-24 15:34:59
【问题描述】:

我在我的 Android 应用中添加了点击声音,但是当我在按钮上点击太快时,声音只播放一次(因为第一次播放还没有完成)。 我希望每次点击都播放声音

我想知道实现我想要的行为的最佳方式是什么?

我把MediaPlayer的实例化放在onCreate()方法中,在onClick()中播放

@Override
protected void onCreate(Bundle savedInstanceState) {
    [...]
    mpClic = MediaPlayer.create(getApplicationContext(),R.raw.clic);
}


vButtonLeft.setOnClickListener(new View.OnClickListener() {
     @Override
     public void onClick(View v) {
        [...]               
        mpClic.start();
     }
});
  • 我试图在 play() 之前 stop() / prepare() 它,但我得到了同样的结果。
  • 我尝试在每次播放时实例化一个新的 MediaPlayer,它可以工作,但我想不推荐这样做(顺便说一下,使用这种方法,如果我很快地向按钮发送太多次垃圾邮件,我的活动中的声音就会停止)

提前谢谢你:)

【问题讨论】:

  • 第二次检查 mpClic.isPlaying() 是否在 mpClic.start(); 之前。 Documentation
  • 好的,但是如果它已经在播放,我怎么能再播放一遍呢?

标签: android android-mediaplayer android-audiomanager


【解决方案1】:

尝试:

vButtonLeft.setOnClickListener(new View.OnClickListener() {
     @Override
     public void onClick(View v) {

    if(mpClic.isPlaying()){
        mpClic.stop();
        mpClic.prepare();
     }
        mpClic.start();
     }
});

【讨论】:

  • 试过了,它做了同样的事情:/
【解决方案2】:

如果声音已经在播放,你可以从头开始播放。

vButtonLeft.setOnClickListener(new View.OnClickListener() 
{
    @Override
    public void onClick(View v) 
    {
        if (mpClic.isPlaying())
        {
            mpClic.seekTo(0);
        }
        else
        {
            mpClic.start();
        }
    }
});

不完全是您想要的,但在大多数情况下会给出令人满意的结果。

【讨论】:

    【解决方案3】:

    我找到了一个解决方法,我减少了我的 clic 声音的长度(从 0.50 秒到 0.17 秒),所以它可以更早地完成播放;然后我启动它的 2 个实例。如果我需要播放声音并且第一个实例已经在播放,我会播放第二个。

    private MediaPlayer mpClic1;
    private MediaPlayer mpClic2; 
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        [...]
        mpClic1 = MediaPlayer.create(getApplicationContext(),R.raw.clic);
        mpClic2 = MediaPlayer.create(getApplicationContext(),R.raw.clic);
    }
    
    vButtonRight.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                [...]
                if(mpClic1.isPlaying())
                    mpClic2.start();
                else
                    mpClic1.start();
            }
        });
    

    这是一种解决方法,所以如果有人知道如何实现重放已经播放的 MediaPlayer 的期望效果,请告诉它,我会将其作为正确答案。 :) 谢谢。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-29
      • 1970-01-01
      • 2012-10-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多