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

Android Kotlin中lateinit属性mediaRecorder未初始化问题求助

解决Kotlin录制应用中“lateinit property mediaRecorder has not been initialized”错误

问题根源分析

你遇到的错误本质是**mediaRecorder这个lateinit变量在未初始化时被调用**,结合你的代码和废弃构造方法的疑问,核心问题有两个:

  1. 使用了API 31+已废弃的MediaRecorder()无参构造,官方要求必须传入Context实例;
  2. 录制状态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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 20:12:09