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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 10:28:06