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