
本文详解如何使用 android mediaplayer 实现指定路径(如 download 目录)中 mp3 文件的循环播放,涵盖数据源设置、异步准备、时长获取及关键循环控制方法,并提供完整可运行代码示例与注意事项。
在 Android 开发中,MediaPlayer 是处理本地或网络音频播放的核心类。若需实现“单曲循环播放”,关键不在于反复调用 setDataSource() 或手动重启,而应启用其内置的循环机制——通过 setLooping(true) 方法即可高效、低开销地实现无缝循环。
以下是一个完整的实践流程,支持从设备特定目录(例如 Download 文件夹)批量扫描 MP3 文件,并对首个有效音频执行循环播放:
✅ 基础循环播放实现(单文件)
MediaPlayer mediaPlayer = new MediaPlayer();
String audioPath = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOAD)
+ File.separator + "background.mp3";
try {
mediaPlayer.reset(); // 确保处于空闲状态
mediaPlayer.setDataSource(audioPath);
mediaPlayer.prepare(); // 同步准备(生产环境建议用 prepareAsync())
mediaPlayer.setLooping(true); // ? 核心:启用循环播放
mediaPlayer.start();
// 可选:显示总时长
textTotalDuration.setText(milliSecondsToTimer(mediaPlayer.getDuration()));
} catch (IOException e) {
e.printStackTrace();
Toast.makeText(this, "播放准备失败", Toast.LENGTH_SHORT).show();
}? setLooping(true) 必须在 prepare()(或 prepareAsync() 完成后)调用,否则无效;且仅对单个音频生效,不自动切换下一首。
? 批量读取 Download 目录下的 MP3 文件
若需动态加载 Download 目录中所有 .mp3 文件并循环播放第一首(或构建播放列表),可结合 File 扫描与 MediaMetadataRetriever 获取元数据:
本文档主要讲述的是android rtsp流媒体播放介绍;实时流协议(RTSP)是应用级协议,控制实时数据的发送。RTSP提供了一个可扩展框架,使实时数据,如音频与视频,的受控、点播成为可能。数据源包括现场数据与存储在剪辑中数据。该协议目的在于控制多个数据发送连接,为选择发送通道,如UDP、组播UDP与TCP,提供途径,并为选择基于RTP上发送机制提供方法。希望本文档会给有需要的朋友带来帮助;感兴趣的朋友可以过来看看
private ListfindMp3FilesInDownload() { List mp3Paths = new ArrayList<>(); File downloadDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOAD); if (downloadDir.exists() && downloadDir.isDirectory()) { File[] files = downloadDir.listFiles(file -> file.isFile() && file.getName().toLowerCase().endsWith(".mp3") ); if (files != null) { for (File file : files) { mp3Paths.add(file.getAbsolutePath()); } } } return mp3Paths; } // 使用示例 List mp3List = findMp3FilesInDownload(); if (!mp3List.isEmpty()) { String firstMp3 = mp3List.get(0); // 接入上述 MediaPlayer 播放逻辑 }
⚠️ 重要注意事项
- 权限声明:Android 10+ 需声明 READ_MEDIA_AUDIO(API 33+)或适配分区存储;旧版本需 READ_EXTERNAL_STORAGE 并动态申请。
-
异步准备更安全:推荐使用 prepareAsync() + OnPreparedListener,避免主线程阻塞:
mediaPlayer.prepareAsync(); mediaPlayer.setOnPreparedListener(mp -> { mp.setLooping(true); mp.start(); textTotalDuration.setText(milliSecondsToTimer(mp.getDuration())); }); - 资源释放:Activity 销毁或暂停时务必调用 mediaPlayer.release(),防止内存泄漏。
- 路径合法性校验:setDataSource() 传入空/非法路径会抛 IOException,务必做 File.exists() 和可读性检查。
✅ 总结
mediaPlayer.setLooping(true) 是实现单音频无限循环最简洁、最可靠的方式,无需监听 OnCompletionListener 后手动 seekTo(0) 和 start()。结合合理的文件扫描、异常处理与生命周期管理,即可构建稳定、专业的本地音频循环播放功能。对于多曲循环(顺序/随机),建议升级至 ExoPlayer 并使用 ConcatenatingMediaSource,以获得更强扩展性与兼容性。








