Android开发中如何在运行时取消音频录制
Android音频录制运行时取消实现方案
核心实现逻辑为终止录制进程、删除临时生成的音频文件、重置录制状态三个步骤,建议录制全程先写入临时缓存文件,仅当用户确认保存时,再将临时文件移动到最终公开存储目录,避免取消时残留无效文件。
方案1:基于MediaRecorder实现(普通音频录制场景常用)
这是大多数常规音视频APP采用的录制方案,适配代码如下:
- 提前定义全局变量存储录制实例、临时文件路径、状态标记
private MediaRecorder mMediaRecorder; private File mTempAudioFile; private boolean isRecording = false;
- 初始化录制时,将临时文件存到应用私有缓存目录,不需要额外申请存储权限
// 初始化示例 mTempAudioFile = new File(getCacheDir(), "temp_record_" + System.currentTimeMillis() + ".mp3"); mMediaRecorder = new MediaRecorder(); mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4); mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC); mMediaRecorder.setOutputFile(mTempAudioFile.getAbsolutePath()); mMediaRecorder.prepare(); mMediaRecorder.start(); isRecording = true;
- 取消按钮点击逻辑实现
btnCancel.setOnClickListener(v -> { if (isRecording && mMediaRecorder != null) { try { mMediaRecorder.stop(); } catch (RuntimeException e) { // 捕获快速点击触发的stop异常,避免崩溃 } finally { // 释放录制资源 mMediaRecorder.release(); mMediaRecorder = null; // 删除临时录制文件 if (mTempAudioFile != null && mTempAudioFile.exists()) { mTempAudioFile.delete(); } // 重置录制状态 isRecording = false; } } });
方案2:基于AudioRecord实现(需要音频流处理/低延迟场景)
如果你的项目需要实时处理音频数据流,采用AudioRecord实现录制时,适配代码如下:
- 定义全局变量
private AudioRecord mAudioRecord; private boolean isRecording = false; private FileOutputStream mTempFileFos; private File mTempAudioFile;
- 取消按钮点击逻辑实现
btnCancel.setOnClickListener(v -> { // 修改录制状态标记,终止子线程的录制循环 isRecording = false; if (mAudioRecord != null) { mAudioRecord.stop(); mAudioRecord.release(); mAudioRecord = null; } // 关闭文件输出流 try { if (mTempFileFos != null) { mTempFileFos.close(); } } catch (IOException e) { e.printStackTrace(); } // 删除临时文件 if (mTempAudioFile != null && mTempAudioFile.exists()) { mTempAudioFile.delete(); } });
- 额外注意:子线程中的音频流读取循环需要判断
isRecording状态,状态变更后直接跳出循环终止录制。
常见问题规避
- 不要在
onDestroy等生命周期方法中重复执行录制停止逻辑,避免重复调用stop方法触发崩溃 - Android 13及以上版本,私有缓存目录的文件不需要申请存储权限即可直接删除,无需额外适配
- 取消按钮建议添加1s防抖逻辑,避免用户多次点击重复执行资源释放流程
内容的提问来源于stack exchange,提问作者Marwat
相关产品推荐
相关产品推荐

