一、使用mediaRecorder.setOutputFile之前应该先创建好本地路径,否则会报java.lang.IllegalStateException: failed to get surface
正确做法是:
private var tempFile: String? = null
private fun startRecording() {
// 1、先创建好本地文件
val file = File(fileName)
if (!file.exists()) {
file.mkdirs()
}
tempFile = File(file, "${System.currentTimeMillis()}.mp3").absolutePath
mediaRecorder = MediaRecorder()
mediaRecorder?.apply {
setAudioSource(MediaRecorder.AudioSource.MIC)
setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP)
// 2、再设置setOutputFile
setOutputFile(tempFile)
setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB)
二、使用mediaRecorder.setOutputFile的IOException异常
发生这种情况主要有:
1、文件路径无效或不可写,应该确保是否已获取写入权限以及目录是否存在;
2、调用setOutputFile()时状态不正确。如果在录制过程中或者在调用prepare()之前调用setOutputFile(),也可能会抛出IOException异常。这是因为setOutputFile()必须在prepare()被调用之前设置好输出文件
正确做法:
private fun startRecording() {
val file = File(fileName)
if (!file.exists()) {
file.mkdirs()
}
tempFile = File(file, "${System.currentTimeMillis()}.mp3").absolutePath
mediaRecorder = MediaRecorder()
mediaRecorder?.apply {
setAudioSource(MediaRecorder.AudioSource.MIC)
setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP)
setOutputFile(tempFile)
setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB)
// setOutputFile()在prepare()之前被调用,并设置好输出文件
try {
prepare()
start()
isRecording = true
} catch (e: IOException) {
e.printStackTrace()
}
}
}