wg2993 2024-10-02 23:15 采纳率: 0%
浏览 53

调用MediaRecorder的stop方法时报java.lang.IllegalStateException

请各位帮忙看看,谢谢!

调用MediaRecorder的stop方法时报java.lang.IllegalStateException
环境:
android:12及以上
JDK:17
说明:
录音部分未出现异常,在mr.stop()处发生上述异常

代码如下:

btnRecord.setOnTouchListener { _, event ->
            val mr = MediaRecorder(root.context)
            when (event.action) {
                MotionEvent.ACTION_DOWN -> {
                    val fp = "${appDataPath!!}/btnRecord"
                    if(!FileUtil.mkDirs(fp)){
                        throw RuntimeException("指定的路径不存在,且未创建成功!")
                    }
                    if (checkSelfPermission(root.context, Manifest.permission.RECORD_AUDIO) == PackageManager.PERMISSION_GRANTED){
                        RecordUtil.startRecord("${fp}/file${System.currentTimeMillis()}.3gp", mr)
                    }
                }
                MotionEvent.ACTION_MOVE -> {
                    // 当滑动时的处理
                }
                MotionEvent.ACTION_UP -> {
                    // 当抬起时的处理
                    RecordUtil.stopRecord(mr)
                }
            }
            true // 返回true表示这个事件被处理了,不再传递
        }


class RecordUtil {
    companion object {
        /**
         * 开始录音
         */
        @JvmStatic
        public fun startRecord(fp: String, mr: MediaRecorder) {
            //设置录音参数
            try {
                mr.setAudioSource(MediaRecorder.AudioSource.MIC)  //1步
                mr.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP)    //2步
                mr.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB)   //3步
                mr.setOutputFile(fp)
                mr.setAudioEncodingBitRate(128000)  // 音频比特率
                mr.setAudioSamplingRate(44100)  // 音频采样率
                mr.prepare()
                mr.start()
            } catch (ex: IllegalStateException) {
                ex.printStackTrace()
            } catch (ex: IOException) {
                ex.printStackTrace()
            }
        }

        /**
         * 停止录音
         */
        @JvmStatic
        public fun stopRecord(mr: MediaRecorder) {
            try {
                mr.stop()
                mr.release()
            } catch (ex: IllegalStateException) {
                ex.printStackTrace()
            }
        }
    }
}
  • 写回答

1条回答 默认 最新

  • 铭渊老黄 新星创作者: Python技术领域 2024-10-04 06:13
    关注
    🕒上午好,题主!目前:🟢[在线]
    📢参考GPT-4o mini 模型、由清水白石008整理提供!
    📣今日金句:“成功是由无数次失败和重新开始的勇气组成的。” — 迈克尔·乔丹
    

    在调用 MediaRecorderstop() 方法时出现 java.lang.IllegalStateException,通常是因为 MediaRecorder 的状态不正确。以下是一些可能导致此异常的原因以及相应的解决方案:

    1. 确保正确的录音流程

    MediaRecorder 的使用流程必须遵循特定的顺序。确保在调用 stop() 方法之前,您已经调用了 start() 方法,并且没有在录音过程中调用 stop()。以下是正确的使用流程:

    1. 设置音频源setAudioSource()
    2. 设置输出格式setOutputFormat()
    3. 设置音频编码器setAudioEncoder()
    4. 设置输出文件setOutputFile()
    5. 准备录音prepare()
    6. 开始录音start()
    7. 停止录音stop()
    8. 释放资源release()

    2. 检查录音状态

    在调用 stop() 方法之前,确保 MediaRecorder 处于录音状态。您可以在 RecordUtil 中添加一个状态标志来跟踪录音状态:

    class RecordUtil {
        companion object {
            private var isRecording = false
    
            @JvmStatic
            fun startRecord(fp: String, mr: MediaRecorder) {
                try {
                    mr.setAudioSource(MediaRecorder.AudioSource.MIC)
                    mr.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP)
                    mr.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB)
                    mr.setOutputFile(fp)
                    mr.setAudioEncodingBitRate(128000)
                    mr.setAudioSamplingRate(44100)
                    mr.prepare()
                    mr.start()
                    isRecording = true // 录音开始
                } catch (ex: IllegalStateException) {
                    ex.printStackTrace()
                } catch (ex: IOException) {
                    ex.printStackTrace()
                }
            }
    
            @JvmStatic
            fun stopRecord(mr: MediaRecorder) {
                try {
                    if (isRecording) {
                        mr.stop()
                        isRecording = false // 录音停止
                    }
                    mr.release()
                } catch (ex: IllegalStateException) {
                    ex.printStackTrace()
                }
            }
        }
    }
    

    3. 确保权限已被授予

    在 Android 12 及以上版本中,确保您已经在运行时请求并获得了录音权限。可以在 onTouch 事件中添加权限检查:

    if (checkSelfPermission(root.context, Manifest.permission.RECORD_AUDIO) != PackageManager.PERMISSION_GRANTED) {
        // 请求权限
        ActivityCompat.requestPermissions(activity, arrayOf(Manifest.permission.RECORD_AUDIO), REQUEST_CODE)
        return
    }
    

    4. 处理异常

    stopRecord 方法中,您可以添加更多的异常处理,以便更好地了解问题所在:

    @JvmStatic
    fun stopRecord(mr: MediaRecorder) {
        try {
            if (isRecording) {
                mr.stop()
                isRecording = false
            }
        } catch (ex: IllegalStateException) {
            Log.e("RecordUtil", "Error stopping MediaRecorder: ${ex.message}")
        } finally {
            mr.release()
        }
    }
    

    5. 确保没有多次调用

    确保在录音过程中没有多次调用 start()stop() 方法。可以通过状态标志来控制录音的开始和结束。

    6. 其他注意事项

    • 确保在调用 stop() 方法之前,录音时间足够长,以避免在未开始录音的情况下调用 stop()
    • 如果您在录音过程中遇到其他异常,确保在 start()stop() 方法中捕获并处理这些异常。

    通过以上步骤,您应该能够解决 java.lang.IllegalStateException 的问题。如果问题仍然存在,请提供更多的错误信息或上下文,以便进一步帮助您。

    评论

报告相同问题?

问题事件

  • 修改了问题 10月3日
  • 创建了问题 10月2日