Kotlin开发录音计时App点击暂停触发IllegalStateException崩溃求助
问题原因
1. 变量赋值语法错误(直接导致if分支未按预期执行、崩溃)
你给recordingStopped变量赋值时误用了双等号==(比较运算符),而非赋值运算符=,导致变量值从未被修改:
pauseRecording方法中的recordingStopped == true没有实际赋值效果,recordingStopped永远保持初始值falseresumeRecording方法中的recordingStopped == false同样没有生效
后续第二次点击暂停按钮时,程序依然会走到调用mediaRecorder?.pause()的分支,但此时MediaRecorder已经处于暂停状态,再次调用pause就会触发IllegalStateException,就是你遇到的崩溃。
2. MediaRecorder实例被意外重置,配置完全丢失
你在savefilename()方法中执行了mediaRecorder = MediaRecorder(),直接把onCreate阶段已经配置好音频参数、输出路径的有效实例替换成了全新的未初始化实例,新实例没有经过setAudioSource、setOutputFormat等必要配置,状态完全异常,调用任何录音相关方法都会触发崩溃。
3. 系统版本兼容风险
MediaRecorder的pause()/resume()方法仅支持Android 7.0(API 24)及以上系统,若在低于该版本的设备上运行,也会直接抛出异常。
修复方案
修正赋值语法
将pauseRecording方法中的recordingStopped == true改为recordingStopped = true
将resumeRecording方法中的recordingStopped == false改为recordingStopped = false删除多余的MediaRecorder重置代码
删掉savefilename()方法中的mediaRecorder = MediaRecorder()行,避免覆盖已经配置完成的实例。增加版本和状态校验
修改pauseRecording方法,调用pause前增加判断逻辑,避免状态异常:
@SuppressLint("RestrictedApi", "SetTextI18n") @TargetApi(Build.VERSION_CODES.N) private fun pauseRecording() { if(state) { pauseTimer() Toast.makeText(this,"This is working", Toast.LENGTH_SHORT).show() if(!recordingStopped){ Toast.makeText(this,"Stopped!", Toast.LENGTH_SHORT).show() // 增加版本判断和非空校验 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N && mediaRecorder != null) { mediaRecorder?.pause() } recordingStopped = true button_pause_recording.text = "Resume" }else{ resumeRecording() resumeTimer() } }else{ Toast.makeText(this,"this is not working", Toast.LENGTH_SHORT).show() } }
- 调整初始化逻辑
将onCreate中MediaRecorder的参数配置逻辑移到startRecording方法内,每次启动录音前重新配置参数,避免状态混乱。
内容的提问来源于stack exchange,提问作者WilliamB
相关产品推荐
相关产品推荐

