
本文详解 android 中使用 mediaplayer 实现音频循环播放的核心方法,涵盖单文件循环与目录批量播放两种场景,并提供完整代码示例、关键注意事项及最佳实践。
在 Android 开发中,MediaPlayer 是处理本地或网络音频播放的常用组件。若需实现无限循环播放(如背景音乐、提示音等),关键在于正确配置 setLooping(true);而若需实现指定目录下所有 MP3 文件的顺序循环播放(例如“下载”文件夹中的全部音频),则需结合文件扫描、队列管理与播放完成监听(OnCompletionListener)进行逻辑控制。
✅ 单音频文件循环播放(基础用法)
只需在 prepare() 之后、start() 之前调用 setLooping(true):
MediaPlayer mediaPlayer = new MediaPlayer();
try {
String audioPath = Environment.getExternalStoragePublicDirectory(
Environment.DIRECTORY_DOWNLOADS) + "/sample.mp3";
mediaPlayer.setDataSource(audioPath);
mediaPlayer.prepare(); // 同步准备(或使用 prepareAsync() + OnPreparedListener)
mediaPlayer.setLooping(true); // ? 核心:启用循环
mediaPlayer.start();
} catch (Exception e) {
e.printStackTrace();
}⚠️ 注意:setLooping(true) 必须在 prepare() 完成后调用,否则会抛出 IllegalStateException;若使用 prepareAsync(),请确保在 OnPreparedListener 回调中设置。
? 批量 MP3 循环播放(目录级轮播)
要实现“遍历指定路径下所有 .mp3 文件并循环播放”,需构建播放队列并手动管理切换逻辑:
html5动态显示媒体视频播放器代码,这个我们在企业网站或者教学网站会用到,教学网站,有一些视频要播放,那么就会用到播放器,可以参考源码,看看播放器的效果是如何实现的,php中文网推荐下载!
private Listmp3Paths = new ArrayList<>(); private int currentIndex = 0; private MediaPlayer mediaPlayer; private void loadAndPlayAllMP3s(String rootPath) { File dir = new File(rootPath); if (!dir.exists() || !dir.isDirectory()) return; File[] files = dir.listFiles((f, name) -> name.toLowerCase().endsWith(".mp3")); if (files != null) { mp3Paths.clear(); for (File file : files) { mp3Paths.add(file.getAbsolutePath()); } playCurrentTrack(); } } private void playCurrentTrack() { if (mp3Paths.isEmpty()) return; try { if (mediaPlayer == null) { mediaPlayer = new MediaPlayer(); mediaPlayer.setOnCompletionListener(mp -> { currentIndex = (currentIndex + 1) % mp3Paths.size(); // 循环索引 playCurrentTrack(); // 自动播放下一首 }); } else { mediaPlayer.reset(); } mediaPlayer.setDataSource(mp3Paths.get(currentIndex)); mediaPlayer.prepare(); mediaPlayer.start(); } catch (Exception e) { e.printStackTrace(); // 可选:跳过当前文件,尝试下一首 currentIndex = (currentIndex + 1) % mp3Paths.size(); playCurrentTrack(); } }
调用方式(需动态权限 READ_EXTERNAL_STORAGE):
loadAndPlayAllMP3s(Environment.getExternalStoragePublicDirectory(
Environment.DIRECTORY_DOWNLOADS).getAbsolutePath());? 关键注意事项
- 权限适配:Android 10+(API 29+)默认启用分区存储(Scoped Storage),访问 Downloads 目录需使用 MediaStore 或申请 MANAGE_EXTERNAL_STORAGE(仅限必要场景,需 Google Play 审核批准);推荐优先使用 MediaStore.Audio.Media.EXTERNAL_CONTENT_URI 查询音频。
- 资源释放:务必在 Activity/Fragment 销毁时调用 mediaPlayer.release() 并置空引用,防止内存泄漏。
- 线程安全:MediaPlayer 方法非线程安全,所有操作应在主线程执行(UI 线程)。
- 异步准备优化:对大文件建议使用 prepareAsync() + OnPreparedListener,避免 ANR。
✅ 总结
mediaPlayer.setLooping(true) 是实现单文件无限循环最简方案;而多文件循环播放本质是“自动顺序播放 + 播放完成回调 + 索引取模”,需自主维护播放状态。实际项目中,建议封装为 AudioPlayerManager 类,整合生命周期感知、错误重试、进度监听等功能,提升可维护性与健壮性。








