Android开发:使用变量控制MediaPlayer的播放与暂停
没问题,我给你整理一套完整的实现方案,完全贴合你的需求,一步步来:
完整实现方案:基于ID播放音频并控制播放/暂停
1. 前期准备确认
首先得确保你的音频文件是放在res/raw目录下的,命名要严格对应a+数据库ID的格式(比如数据库ID为1的音频,文件名就是a1.mp3或者a1.wav,后缀会被系统忽略),这样才能通过动态拼接的名称找到对应的资源。
2. 核心代码实现
2.1 先定义类成员变量
在你的Activity或者Fragment里,先声明全局的MediaPlayer实例和播放状态标记,这样点击事件里才能复用:
private MediaPlayer mediaPlayer; private boolean isPlaying = false; // 标记当前是否正在播放
2.2 动态获取音频资源ID并初始化MediaPlayer
按照你的逻辑,从数据库拿到ID后拼接资源名称,然后用getResources().getIdentifier()拿到对应的raw资源ID,再初始化MediaPlayer:
// 假设standard是你从数据库查询到的实体对象 String stringId = "a" + String.valueOf(standard.getId()); // 获取音频资源ID:参数分别是资源名、资源类型(raw)、应用包名 int audioResId = getResources().getIdentifier(stringId, "raw", getPackageName()); // 先判断资源是否存在,避免空指针 if (audioResId == 0) { Toast.makeText(this, "找不到对应的音频资源", Toast.LENGTH_SHORT).show(); return; } // 初始化MediaPlayer,create方法会自动完成prepare操作,不用手动调用prepare() mediaPlayer = MediaPlayer.create(this, audioResId); // 设置播放完成的回调,自动重置状态和图标 mediaPlayer.setOnCompletionListener(mp -> { isPlaying = false; play.setImageResource(R.drawable.ic_play); // 切换回播放图标 });
2.3 播放按钮的点击事件逻辑
接下来给FloatingActionButton绑定点击事件,实现播放/暂停的切换逻辑:
final FloatingActionButton play = findViewById(R.id.play); play.setOnClickListener(v -> { // 先判断MediaPlayer是否初始化成功 if (mediaPlayer == null) { Toast.makeText(this, "音频资源未加载,请重试", Toast.LENGTH_SHORT).show(); return; } if (!isPlaying) { // 开始播放 mediaPlayer.start(); isPlaying = true; play.setImageResource(R.drawable.ic_pause); // 切换为暂停图标 } else { // 暂停播放 mediaPlayer.pause(); isPlaying = false; play.setImageResource(R.drawable.ic_play); // 切换回播放图标 } });
3. 必须注意的生命周期管理
Android里MediaPlayer是重量级对象,一定要在生命周期里及时释放资源,避免内存泄漏和播放异常:
@Override protected void onDestroy() { super.onDestroy(); if (mediaPlayer != null) { if (mediaPlayer.isPlaying()) { mediaPlayer.stop(); } mediaPlayer.release(); // 释放资源 mediaPlayer = null; // 置空避免引用 } } @Override protected void onPause() { super.onPause(); // 当App退到后台时,自动暂停播放 if (mediaPlayer != null && mediaPlayer.isPlaying()) { mediaPlayer.pause(); isPlaying = false; play.setImageResource(R.drawable.ic_play); } }
4. 小优化建议
- 如果你的音频资源比较大,或者需要频繁切换音频,建议用
prepareAsync()异步初始化,避免阻塞主线程,不过create()方法已经做了优化,小音频用这个没问题。 - 图标资源可以用Material Design的官方图标,直接在Android Studio里搜索
play和pause就能添加。
内容的提问来源于stack exchange,提问作者Dirk Schotelhoofd
相关产品推荐
相关产品推荐

