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

Android Studio Kotlin设置setOnCompletionListener后音频仍循环如何解决

故障原因及修复方案

问题根源

  • 主动开启了循环播放属性:MediaPlayer初始化时设置了isLooping = true,该属性开启后会自动重复播放音频,永远不会触发播放完成回调
  • 完成监听绑定时机错误:在onCreate中对还未初始化的mediaPlayer空对象设置监听,监听逻辑没有实际绑定到播放器实例上,播放完成后不会执行对应回调代码

修复步骤

  1. 关闭循环播放:将MediaPlayer初始化代码中的mediaPlayer!!.isLooping = true改为false,或直接删除该行(MediaPlayer默认关闭循环)
  2. 调整监听绑定位置:将setOnCompletionListener逻辑移动到MediaPlayer.create()执行完成之后,确保监听绑定到实际的播放器实例上
  3. 优化代码空安全:在播放器操作逻辑中增加非空判断,避免空指针异常

修正后核心代码

btnPlay.setOnClickListener(object : View.OnClickListener {
    override fun onClick(v: View?) {
        if (mediaPlayer == null) {
            mediaPlayer = MediaPlayer.create(this@DetailActivity, Uri.parse(classAudio))
            // 关闭循环播放
            mediaPlayer!!.isLooping = false
            // 此处绑定完成监听,确保绑定到已初始化的播放器实例
            mediaPlayer!!.setOnCompletionListener {
                btnPlay.isEnabled = true
                btnStop.isEnabled = false
                mediaPlayer?.apply {
                    if (isPlaying) stop()
                    reset()
                    release()
                }
                mediaPlayer = null
                Toast.makeText(applicationContext, "播放结束", Toast.LENGTH_SHORT).show()
            }
            mediaPlayer!!.start()
            btnStop.isEnabled = true
            btnPlay.isEnabled = false
            Toast.makeText(applicationContext, "开始播放", Toast.LENGTH_SHORT).show()
        } else {
            mediaPlayer!!.start()
        }
    }
})

注意:删除原onCreate方法中写在btnPlay.setOnClickListener之外的无效setOnCompletionListener绑定代码。

内容的提问来源于stack exchange,提问作者CaesarHo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 04:36:04