You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 18:32:27