如何在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
相关产品推荐
相关产品推荐

