Android Kotlin中lateinit属性mediaRecorder未初始化问题求助
解决Kotlin录制应用中“lateinit property mediaRecorder has not been initialized”错误
问题根源分析
你遇到的错误本质是**mediaRecorder这个lateinit变量在未初始化时被调用**,结合你的代码和废弃构造方法的疑问,核心问题有两个:
- 使用了API 31+已废弃的
MediaRecorder()无参构造,官方要求必须传入Context实例; - 录制状态
isRecording与mediaRecorder的初始化状态可能出现不一致,导致未初始化时触发stop/reset操作。
具体修复方案
1. 替换MediaRecorder构造方法
Activity本身就是Context实例,直接用带Context的构造创建MediaRecorder:
// 替换原来的无参构造,传入Activity的Context mediaRecorder = MediaRecorder(this)
2. 完善状态检查与异常处理
在操作mediaRecorder前必须确保它已初始化,同时避免状态不一致:
findViewById<Button>(R.id.record_button).apply { setOnClickListener { if (isRecording) { // 双重检查:状态为录制中,且mediaRecorder已初始化 if (::mediaRecorder.isInitialized) { try { mediaRecorder.stop() mediaRecorder.reset() } catch (e: Exception) { e.printStackTrace() } } isRecording = false } else { try { mediaRecorder = MediaRecorder(this@MainActivity) // 明确传入Activity Context setupMediaRecorder() startRecording() isRecording = true } catch (e: Exception) { // 初始化或准备失败时重置状态,避免下次点击出错 e.printStackTrace() isRecording = false if (::mediaRecorder.isInitialized) { mediaRecorder.release() } } } } }
3. 补充必要权限
录制视频除了CAMERA权限,还需要:
- API 29及以下:
WRITE_EXTERNAL_STORAGE(用于保存视频文件) - 如需录制音频:
RECORD_AUDIO
在Manifest中添加权限:
<uses-permission android:name="android.permission.RECORD_AUDIO" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="28" />
同时在代码中动态申请这些权限,和CAMERA权限一起处理。
4. 优化资源释放逻辑
在Activity销毁时,确保释放MediaRecorder资源:
override fun onDestroy() { super.onDestroy() if (::mediaRecorder.isInitialized) { mediaRecorder.release() } }
额外注意事项
- 确保
videoSize已正确初始化,避免setupMediaRecorder时出现空指针; createFile()方法要保证生成的路径有可写入权限,否则prepare()会抛出异常,导致mediaRecorder未就绪。
内容的提问来源于stack exchange,提问作者Akigomon505
相关产品推荐
相关产品推荐

