Android - MediaPlayer停止播放

时间:2015-11-10 02:05:10

标签: android media-player android-mediaplayer

我正在创建一个应用程序,您可以在其中摇动设备并播放声音。我有一切工作,但当我长时间摇动设备(5秒)时,声音停止播放。这是我的代码:

MediaPlayer mp = null;
private void executeShakeAction() {
    Random random = new Random();
    int nextInt = random.nextInt(3);
    if(nextInt == 0) {
        mp = MediaPlayer.create(this, R.raw.cowbell);
    }else if(nextInt == 1){
        mp = MediaPlayer.create(this, R.raw.cowbell1);
    }else{
        mp = MediaPlayer.create(this, R.raw.cowbell3);
    }
    mp.start();
}

1 个答案:

答案 0 :(得分:1)

如果您经常摇晃设备,音频文件就没有时间完成。这让Android的生活如此艰难,最终放弃并停止播放。

建议:

  • 如果正在播放,请避免创建MediaPlayer实例,例如

    if(mp!= null&& mp.isPlaying())return;

  • 使用SoundPool代替MediaPlayer,MediaPlayer专门用于播放短音(而不是音乐或视频,如MediaPlayer)。

  • 如果您坚持使用MediaPlayer,请创建一次,而不是一直重新创建它。这段代码仍然远非完美,但希望能够完成这项工作:

private final MediaPlayer mp = new MediaPlayer();
private final Random random = new Random();
private static final int[] SoundResIds = {R.raw.cowbell, R.raw.cowbell1, R.raw.cowbell2};
private synchronized void executeShakeAction() {
    if (!mp.isPlaying()) 
       try {
          mp.reset();  // Clears mp state  
          int soundResId = SoundResIds[random.nextInt(SoundResIds.length)];
          AssetFileDescriptor afd = getResources().openRawResourceFd(soundResId);
          mp.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength());
          afd.close();
          mp.prepare();
          mp.start();
       } catch (Exception ex) {
          ex.printStackTrace();
       }
}