Android - MediaPlayer 停止播放

Android - MediaPlayer stops playing

我正在创建一个应用程序,您可以在其中摇动设备并播放声音。我一切正常,但是当我长时间(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();
}

如果您经常摇晃设备,音频文件将来不及完成。这让 Android 的生活变得如此艰难,以至于它最终放弃并停止了比赛。

建议:

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

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

  • 使用 SoundPool 而不是 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();
       }
}