Android Studio Kotlin设置setOnCompletionListener后音频仍循环如何解决
故障原因及修复方案
问题根源
- 主动开启了循环播放属性:MediaPlayer初始化时设置了
isLooping = true,该属性开启后会自动重复播放音频,永远不会触发播放完成回调 - 完成监听绑定时机错误:在
onCreate中对还未初始化的mediaPlayer空对象设置监听,监听逻辑没有实际绑定到播放器实例上,播放完成后不会执行对应回调代码
修复步骤
- 关闭循环播放:将MediaPlayer初始化代码中的
mediaPlayer!!.isLooping = true改为false,或直接删除该行(MediaPlayer默认关闭循环) - 调整监听绑定位置:将
setOnCompletionListener逻辑移动到MediaPlayer.create()执行完成之后,确保监听绑定到实际的播放器实例上 - 优化代码空安全:在播放器操作逻辑中增加非空判断,避免空指针异常
修正后核心代码
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
相关产品推荐
相关产品推荐

