【问题标题】:Sound stopping after some time - Android一段时间后声音停止 - Android
【发布时间】:2017-06-01 02:44:59
【问题描述】:

每次单击按钮时都会调用此代码。一段时间后,当我单击按钮时,不再显示声音。我尝试使用另一个音乐文件,也尝试使用 MediaPlayer 而不是 SoundPool,但问题一直在发生。

更具体的问题是:我点击了10次,它正在返回声音,当我再次点击时它停止了

public void displaySound(Context context){
        SoundPool sp = new SoundPool(5, AudioManager.STREAM_MUSIC, 0);
        int soundId = sp.load(context, R.raw.bubble_nice, 1);
        sp.play(soundId, 1, 1, 0, 0, 1);
        MediaPlayer mPlayer = MediaPlayer.create(context, R.raw.bubble_nice);
        mPlayer.start();
    }

当声音停止时,日志中会出现:E/MediaPlayer: error (1, -19)

【问题讨论】:

  • 我认为你应该在使用新的之前发布 mPlayer。
  • 我该怎么做?
  • 你应该参考 BSavaliya 的解决方案。

标签: java android android-mediaplayer android-audiomanager


【解决方案1】:

我已经尝试了你的代码并找到了解决方案,你可以尝试如下:

首先像全局一样声明一个媒体播放器对象

MediaPlayer mPlayer;

然后在点击按钮时使用以下方法。

 public void displaySound(Context context) {
    if (mPlayer != null && mPlayer.isPlaying()) {
        mPlayer.stop();
        mPlayer.reset();
    }
    mPlayer = MediaPlayer.create(context, R.raw.bubble_nice);
    mPlayer.start();
}

【讨论】:

    【解决方案2】:

    当活动暂停时,你必须暂停你的媒体播放器,活动的 onStart() 方法你可以再次调用它。下面的代码

    @Override
    protected void onStart() {
        mPlayer.reset();
        super.onStart();
    }
    
    @Override
    protected void onPause() {
        mPlayer.pause();
        super.onPause();
    }
    
    @Override
    protected void onDestroy() {
        mPlayer.stop();
        super.onDestroy();
    }
    

    【讨论】:

      【解决方案3】:

      对 BSavaliya 的代码稍作修改,对我来说效果更好: 首先将 mPlayer 声明为全局变量。

       if (mPlayer != null )
       {
           if(mPlayer .isPlaying())
           {   
             mPlayer .stop();
           }    
           mPlayer .reset();
       }
      

      【讨论】: