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

Android开发中MediaPlayer按钮双击停止音频功能仅生效一次问题求解

问题根因

你的功能无法正常复用主要是以下几个逻辑错误导致的:

  1. 全局计数器counter没有重置逻辑:第一次双击后counter会累加到2,之后每次点击都会继续递增,永远不会再次等于2,所以停止逻辑只会触发一次
  2. 播放暂停逻辑顺序错误:就算触发了mediaPlayer1.pause(),后续也会无条件执行mediaPlayer1.start(),等于暂停后立刻重新播放,实际没有停止效果
  3. 控件绑定错误:aspamm控件绑定的id是R.id.gdsph_btn,和第二个按钮共用同一个控件,两个点击事件冲突,第三个音频的播放逻辑无法正常触发
  4. 缺少双击时间间隔判断:当前逻辑下只要两次点击就算间隔几个小时也会判定为双击,不符合常规交互逻辑
修复代码
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.21 06:45:04