Android中如何通过setDataSource实现音乐循环播放?
Android中通过setDataSource实现音乐循环播放及MP3文件读取
一、实现音乐循环播放的核心逻辑
通过setDataSource指定音频路径后,可通过两种方式实现循环播放:
- 直接调用
setLooping(true):让MediaPlayer在播放结束后自动从头开始,适合简单循环场景。 - 监听
OnCompletionListener:在播放完成回调中重新配置数据源并启动播放,可自定义循环前后的逻辑。
二、单个MP3文件循环播放代码片段
private MediaPlayer mediaPlayer; // 替换为你的音频文件路径 private String audioPath = "/storage/emulated/0/Download/test.mp3"; private void initLoopPlayback() { try { mediaPlayer = new MediaPlayer(); // 设置音频数据源 mediaPlayer.setDataSource(audioPath); // 异步准备音频,避免阻塞主线程 mediaPlayer.prepareAsync(); mediaPlayer.setOnPreparedListener(mp -> { // 开启循环播放 mp.setLooping(true); // 启动播放 mp.start(); // 更新总时长显示 textTotalDuration.setText(milliSecondsToTimer(mp.getDuration())); }); // 播放错误处理 mediaPlayer.setOnErrorListener((mp, what, extra) -> { // 根据业务需求处理错误,如提示用户 return false; }); } catch (IOException e) { e.printStackTrace(); } } // 辅助方法:将毫秒数转换为时分秒格式 private String milliSecondsToTimer(long milliseconds) { String finalTimerString = ""; String secondsString = ""; int hours = (int) (milliseconds / (1000 * 60 * 60)); int minutes = (int) (milliseconds % (1000 * 60 * 60)) / (1000 * 60); int seconds = (int) ((milliseconds % (1000 * 60 * 60)) % (1000 * 60) / 1000); if (hours > 0) { finalTimerString = hours + ":"; } secondsString = seconds < 10 ? "0" + seconds : String.valueOf(seconds); finalTimerString += minutes + ":" + secondsString; return finalTimerString; } // 生命周期中销毁MediaPlayer,避免内存泄漏 @Override protected void onDestroy() { super.onDestroy(); if (mediaPlayer != null) { mediaPlayer.stop(); mediaPlayer.release(); mediaPlayer = null; } }
三、读取指定路径(如下载文件夹)下的所有MP3文件
权限说明
- Android 12及以下:需在Manifest中添加
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />,并动态申请权限。 - Android 13及以上:使用
READ_MEDIA_AUDIO权限即可访问音频文件。
实现代码
private List<String> getMp3FilesFromDir(String targetDirPath) { List<String> mp3Paths = new ArrayList<>(); File directory = new File(targetDirPath); if (!directory.exists() || !directory.isDirectory()) { return mp3Paths; } // 过滤出后缀为.mp3的文件 File[] mp3Files = directory.listFiles((dir, fileName) -> fileName.toLowerCase().endsWith(".mp3") ); if (mp3Files != null) { for (File file : mp3Files) { mp3Paths.add(file.getAbsolutePath()); } } return mp3Paths; } // 调用示例:获取系统下载文件夹下的MP3文件 private void fetchDownloadFolderMp3s() { String downloadDirPath = Environment.getExternalStoragePublicDirectory( Environment.DIRECTORY_DOWNLOADS ).getAbsolutePath(); List<String> mp3List = getMp3FilesFromDir(downloadDirPath); // 遍历处理获取到的MP3路径 for (String path : mp3List) { Log.d("MP3_PATH", path); } }
内容的提问来源于stack exchange,提问作者lav saden
相关产品推荐
相关产品推荐

