课程名称:即时通讯项目里面的语音处理-基础实现篇
课程章节:2-3 Android-字节流模式声音录制功能实现-上
主讲老师:Piasy
老师的例子是:
private volatile boolean mIsRecording;
按我的理解,应该就是类似于kotlin的lateinit var mIsRecording: AtomicBoolean
这里跟前两天的业务逻辑差别不大,这里就不做赘述了,可以参考我在gitee上面的代码
大致逻辑是:
- 创建录音文件
- 创建文件输出流
- 配置AudioRecorder
- 记录开始录音时间
- 循环读取数据,写入输出流
- 根据录音状态退出循环
lateinit var mAudioFile:File lateinit var viewBinding: ActivityAnotherRecorderBinding // 原子化的布尔值,线程安全 lateinit var bIsRecording: AtomicBoolean override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) viewBinding = ActivityAnotherRecorderBinding.inflate(layoutInflater) setContentView(viewBinding.root) bIsRecording.set(false) viewBinding.btnRecord.setOnClickListener { if (bIsRecording.get()) { // 停止录音 if (!stopRecord()){ showFailMsg("结束录音失败") } } else { // 开始录音 if (!startRecord()) { showFailMsg("录音失败") } } changeUIState() } } /** * 提示错误信息 */ private fun showFailMsg(errMsg: String) { uiThread { Toast.makeText(this@AnotherRecordActivity, errMsg, Toast.LENGTH_SHORT).show() } } /** * 停止录音代码 */ private fun stopRecord(): Boolean { bIsRecording.set(false) } /** * 开始录音代码 */ private fun startRecord(): Boolean { bIsRecording.set(true) // 创建录音文件 createRecordFile() // 创建文件输出流 // 配置AudioRecorder // 记录开始录音时间 // 循环读取数据,写入输出流 // 根据录音状态退出循环 return true } /** * 更新界面 */ private fun changeUIState() { viewBinding.btnRecord.text = if (bIsRecording.get()) "停止录制" else "开始录音" } /** * 创建录音文件 */ private fun createRecordFile(){ // 创建录音文件 var path = "" if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) { if (Build.VERSION.SDK_INT > Build.VERSION_CODES.Q) { path = "${application.filesDir}/iMookDemo/" } else { val external = applicationContext.getExternalFilesDir(null) if (external != null) { path = external.absolutePath } } } else { path = applicationContext.filesDir.absolutePath } mAudioFile = File("${path}/${System.currentTimeMillis()}.pcm") if (!mAudioFile.parentFile.exists()) { val mddirResult = mAudioFile.parentFile?.mkdir() } mAudioFile.createNewFile() }