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