0

0

如何在 Android 中实现 MediaPlayer 的循环播放

碧海醫心

碧海醫心

发布时间:2026-02-10 23:20:13

|

652人浏览过

|

来源于php中文网

原创

如何在 Android 中实现 MediaPlayer 的循环播放

本文详解 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动态显示媒体视频播放器代码
html5动态显示媒体视频播放器代码

html5动态显示媒体视频播放器代码,这个我们在企业网站或者教学网站会用到,教学网站,有一些视频要播放,那么就会用到播放器,可以参考源码,看看播放器的效果是如何实现的,php中文网推荐下载!

下载
private List mp3Paths = 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 类,整合生命周期感知、错误重试、进度监听等功能,提升可维护性与健壮性。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

633

2023.08.10

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

633

2023.08.10

android开发三大框架
android开发三大框架

android开发三大框架是XUtil框架、volley框架、ImageLoader框架。本专题为大家提供android开发三大框架相关的各种文章、以及下载和课程。

305

2023.08.14

android是什么系统
android是什么系统

Android是一种功能强大、灵活可定制、应用丰富、多任务处理能力强、兼容性好、网络连接能力强的操作系统。本专题为大家提供android相关的文章、下载、课程内容,供大家免费下载体验。

1784

2023.08.22

android权限限制怎么解开
android权限限制怎么解开

android权限限制可以使用Root权限、第三方权限管理应用程序、ADB命令和Xposed框架解开。详细介绍:1、Root权限,通过获取Root权限,用户可以解锁所有权限,并对系统进行自定义和修改;2、第三方权限管理应用程序,用户可以轻松地控制和管理应用程序的权限;3、ADB命令,用户可以在设备上执行各种操作,包括解锁权限;4、Xposed框架,用户可以在不修改系统文件的情况下修改应用程序的行为和权限。

2066

2023.09.19

android重启应用的方法有哪些
android重启应用的方法有哪些

android重启应用有通过Intent、PendingIntent、系统服务、Runtime等方法。本专题为大家提供Android相关的文章、下载、课程内容,供大家免费下载体验。

277

2023.10.18

Android语音播放功能实现方法
Android语音播放功能实现方法

实现方法有使用MediaPlayer实现、使用SoundPool实现两种。可以根据具体的需求选择适合的方法进行实现。想了解更多语音播放的相关内容,可以阅读本专题下面的文章。

353

2024.03.01

包子漫画网页版入口与全集阅读指南_正版免费漫画快速访问方法
包子漫画网页版入口与全集阅读指南_正版免费漫画快速访问方法

本专题汇总了包子漫画官网和网页版入口,提供最新章节抢先看方法、正版免费阅读指南,以及稳定访问方式,帮助用户快速直达包子漫画页面,无广告畅享全集漫画内容。

47

2026.02.10

MC.JS网页版快速畅玩指南_MC.JS官网在线入口及免安装体验方法
MC.JS网页版快速畅玩指南_MC.JS官网在线入口及免安装体验方法

本专题汇总了MC.JS官网入口和网页版快速畅玩方法,提供免安装访问、不同版本(1.8.8、1.12.8)在线体验指南,以及正版网页端操作说明,帮助玩家轻松进入MC.JS世界,实现即时畅玩与高效体验。

35

2026.02.10

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Excel 教程
Excel 教程

共162课时 | 16.5万人学习

Java 教程
Java 教程

共578课时 | 62.5万人学习

Uniapp从零开始实现新闻资讯应用
Uniapp从零开始实现新闻资讯应用

共64课时 | 6.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号