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

如何在ActionBar中添加停止MediaPlayer播放声音的按钮?

解决方案:给ActionBar添加MediaPlayer停止按钮

嘿,这个需求完全可以搞定!既然你用的是MediaPlayer而不是SoundPool,咱们就针对MediaPlayer来做适配,不用改你现有的播放逻辑~

核心思路

因为你有多个独立的MediaPlayer实例,最方便的方式是把它们统一放到一个集合里管理,这样点击停止按钮时,只需要遍历集合就能检查并停止所有正在播放的音频。


步骤1:统一管理MediaPlayer实例

首先,把所有的MediaPlayer放到一个List集合中,这样后续遍历起来更方便:

import java.util.ArrayList;
import java.util.List;
import android.media.MediaPlayer;
import android.net.Uri;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import androidx.appcompat.app.AppCompatActivity;

public class YourSoundboardActivity extends AppCompatActivity {
    // 声明集合存储所有MediaPlayer
    private List<MediaPlayer> mediaPlayers = new ArrayList<>();
    private MediaPlayer mysound1;
    private MediaPlayer mysound2;
    private MediaPlayer mysound3;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.your_activity_layout);

        // 初始化每个MediaPlayer,并添加到集合中
        mysound1 = MediaPlayer.create(this, R.raw.jah_dogdugunkoy);
        mediaPlayers.add(mysound1);

        mysound2 = MediaPlayer.create(this, R.raw.jah_vidanjor);
        mediaPlayers.add(mysound2);

        mysound3 = MediaPlayer.create(this, R.raw.jah_borazan);
        mediaPlayers.add(mysound3);
    }
}

步骤2:创建ActionBar的停止按钮菜单

在res/menu目录下创建一个新的菜单文件(比如action_bar_menu.xml),添加停止按钮的配置:

<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">
    <!-- 停止按钮:showAsAction="always"表示始终显示在ActionBar上 -->
    <item
        android:id="@+id/action_stop"
        android:icon="@drawable/ic_stop" <!-- 替换成你的停止图标资源 -->
        android:title="停止所有声音"
        app:showAsAction="always"/>
</menu>

步骤3:加载菜单并处理点击事件

在你的Activity中重写菜单相关方法,加载上面的菜单,并处理停止按钮的点击逻辑:

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // 加载ActionBar菜单
    getMenuInflater().inflate(R.menu.action_bar_menu, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    int id = item.getItemId();
    if (id == R.id.action_stop) {
        // 点击停止按钮时,调用停止所有音频的方法
        stopAllPlayingSounds();
        return true;
    }
    return super.onOptionsItemSelected(item);
}

步骤4:实现停止所有音频的方法

编写一个方法,遍历集合中的所有MediaPlayer,检查是否正在播放,如果是则停止并重置状态(确保下次播放能正常工作):

private void stopAllPlayingSounds() {
    for (MediaPlayer player : mediaPlayers) {
        // 先判断播放器不为空且正在播放
        if (player != null && player.isPlaying()) {
            player.stop();
            // stop()后需要重置播放器状态,否则下次播放会报错
            player.reset();
            // 重新设置音频数据源,这样下次点击播放按钮时可以直接start
            try {
                // 根据不同的MediaPlayer实例,重新绑定对应的资源文件
                if (player == mysound1) {
                    player.setDataSource(this, Uri.parse("android.resource://" + getPackageName() + "/" + R.raw.jah_dogdugunkoy));
                } else if (player == mysound2) {
                    player.setDataSource(this, Uri.parse("android.resource://" + getPackageName() + "/" + R.raw.jah_vidanjor));
                } else if (player == mysound3) {
                    player.setDataSource(this, Uri.parse("android.resource://" + getPackageName() + "/" + R.raw.jah_borazan));
                }
                player.prepare();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}

可选优化:播放按钮的状态兼容

为了确保停止后再次点击播放按钮能正常工作,可以稍微修改你的播放按钮点击方法,兼容播放器的状态:

public void mybuttonn1(View view) {
    if (!mysound1.isPlaying()) {
        // 如果播放器已经被reset,需要重新prepare或者重新创建
        if (!mysound1.isPrepared()) {
            try {
                mysound1.prepare();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        mysound1.start();
    }
}

// 同理,其他播放按钮也可以这样修改
public void mybuttonn2(View view) {
    if (!mysound2.isPlaying()) {
        if (!mysound2.isPrepared()) {
            try {
                mysound2.prepare();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        mysound2.start();
    }
}

内容的提问来源于stack exchange,提问作者Alper Göktepe

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 06:29:34