讲师中心 微信公众号
AI工具推荐 视频效率加速

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

冬涛君_4958

冬涛君_4958

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

|

772人浏览过

|

来源于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 文件并循环播放”,需构建播放队列并手动管理切换逻辑:

Android Control
Android Control

通过命令行工具(uiautomator、screencap、input、am)控制安卓设备。优先尝试非 root 执行,失败后自动回退至 root...

下载
private List<String> 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工具

更多
WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

Lovart
Lovart Hot

一款面向视觉设计创作的AI设计平台,可通过智能体和画布工作流辅助制作海报、Logo、网页、PPT及其他视觉内容。

PixTV
PixTV Hot

PixTV是一款面向AIGC内容创作的AI视频生成工具。

SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

VibeKnow
VibeKnow Hot

一款AI视频创作工具,主要用于全球首个AI知识视频创作平台,文档、文章、网页,一键生成视频,适合需要提升相关任务效率的用户。

讯飞智文

一款面向学习和办公场景的AI文档创作工具,可辅助生成PPT与Word文档,提高资料整理和内容制作效率。

相关专题

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

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

4678

2023.08.10

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

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

922

2023.08.14

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

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

2767

2023.08.22

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

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

5557

2023.09.19

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

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

725

2023.10.18

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

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

984

2024.03.01

Postman身份认证怎么配置
Postman身份认证怎么配置

本专题从实际API接口调试场景出发,讲解Postman身份认证的完整配置流程,包括常见认证协议介绍、授权参数设置、访问令牌填写、OAuth 2.0授权及认证失败排查,帮助用户正确完成接口授权与访问验证。

0

2026.11.06

Postman请求头Headers怎么设置
Postman请求头Headers怎么设置

围绕Postman HTTP请求头配置展开,讲解Headers选项的具体使用方式,包括Key和Value参数填写、请求头信息添加、常见Header字段设置及请求头修改方法,帮助用户解决接口调试过程中遇到的请求头配置问题。

0

2026.11.06

Postman接口请求发送教程
Postman接口请求发送教程

详细介绍Postman接口请求的创建与发送方法,涵盖GET和POST请求、URL配置、请求参数、Headers请求头、Body请求体设置以及响应结果查看,帮助用户掌握Postman接口请求的完整操作流程。

0

2026.11.06

热门下载

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

精品课程

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

共162课时 | 45.3万人学习

Java 教程
Java 教程

共578课时 | 196.8万人学习

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

共64课时 | 9.7万人学习

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn