Android开发中MediaPlayer按钮双击停止音频功能仅生效一次问题求解
问题根因
你的功能无法正常复用主要是以下几个逻辑错误导致的:
- 全局计数器
counter没有重置逻辑:第一次双击后counter会累加到2,之后每次点击都会继续递增,永远不会再次等于2,所以停止逻辑只会触发一次 - 播放暂停逻辑顺序错误:就算触发了
mediaPlayer1.pause(),后续也会无条件执行mediaPlayer1.start(),等于暂停后立刻重新播放,实际没有停止效果 - 控件绑定错误:
aspamm控件绑定的id是R.id.gdsph_btn,和第二个按钮共用同一个控件,两个点击事件冲突,第三个音频的播放逻辑无法正常触发 - 缺少双击时间间隔判断:当前逻辑下只要两次点击就算间隔几个小时也会判定为双击,不符合常规交互逻辑
修复代码
public class MainActivity extends AppCompatActivity { private Button rrjk_btn, gdsph_btn, aspamm; private MediaPlayer mediaPlayer1, mediaPlayer2, mediaPlayer3; // 记录上次点击的时间,判断双击 private long lastClickTime = 0; // 双击间隔阈值,单位毫秒 private static final long DOUBLE_CLICK_GAP = 300; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 第一个按钮逻辑:单击播放,双击停止 mediaPlayer1 = MediaPlayer.create(this, R.raw.radhasoami_rakshak_jeev_ke); rrjk_btn = findViewById(R.id.rrjk_btn); rrjk_btn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { long currentTime = System.currentTimeMillis(); if (currentTime - lastClickTime <= DOUBLE_CLICK_GAP) { // 双击触发停止 if (mediaPlayer1.isPlaying()) { mediaPlayer1.pause(); // 可选:如果需要下次播放从头开始,替换上面pause为下面两行 // mediaPlayer1.stop(); // mediaPlayer1.prepare(); } lastClickTime = 0; // 重置时间 return; } // 单击触发播放 if (!mediaPlayer1.isPlaying()) { mediaPlayer1.start(); } lastClickTime = currentTime; } }); // 第二个按钮逻辑 mediaPlayer2 = MediaPlayer.create(MainActivity.this, R.raw.guru_dhara_sheesh_par_haath); gdsph_btn = findViewById(R.id.gdsph_btn); gdsph_btn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (!mediaPlayer2.isPlaying()) { mediaPlayer2.start(); } } }); // 第三个按钮逻辑:修正绑定的id,替换为布局里你对应的实际id即可 aspamm = findViewById(R.id.aspamm); mediaPlayer3 = MediaPlayer.create(MainActivity.this, R.raw.ae_satguru_pita_aur_malik_mere); aspamm.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (!mediaPlayer3.isPlaying()) { mediaPlayer3.start(); } } }); } @Override protected void onDestroy() { super.onDestroy(); // 页面销毁时释放MediaPlayer资源,避免内存泄漏 if (mediaPlayer1 != null) { mediaPlayer1.release(); mediaPlayer1 = null; } if (mediaPlayer2 != null) { mediaPlayer2.release(); mediaPlayer2 = null; } if (mediaPlayer3 != null) { mediaPlayer3.release(); mediaPlayer3 = null; } } }
额外注意事项
- 如果需要双击停止后下次播放从头开始,可以把
pause()改为stop()+prepare()的组合 - 如果需要多个按钮都支持双击停止逻辑,不要共用全局的点击时间变量,每个按钮单独维护自己的点击时间戳
- 音频较多的情况下建议不要同时初始化所有MediaPlayer,按需加载避免占用过多内存
内容的提问来源于stack exchange,提问作者Agru
相关产品推荐
相关产品推荐

