-
Android系统底层对录音有限制,同一时间只支持一个进程使用录音的功能
-
业务需要,一切事务保证主App的录音功能
-
为了更好的管理录音状态,以及多App相互通信问题
架构图设计
Architecture
App层
包含公司所有需要集成录音服务的端,这里不需要解释
Manager层
该层负责Service层的管理,包括:服务的绑定,解绑,注册回调,开启录音,停止录音,检查录音状态,检查服务运行状态等 ###Service层 核心逻辑层,通过AIDL的实现,来满足跨进程通信,并提供实际的录音功能。
目录一览
看代码目录的分配,并结合架构图,我们来从底层往上层实现一套逻辑
IRecorder 接口定义
public interface IRecorder {
String startRecording(RecorderConfig recorderConfig);
void stopRecording();
RecorderState state();
boolean isRecording();
}
IRecorder 接口实现
class JLMediaRecorder : IRecorder {
private var mMediaRecorder: MediaRecorder? = null
private var mState = RecorderState.IDLE
@Synchronized
override fun startRecording(recorderConfig: RecorderConfig): String {
try {
mMediaRecorder = MediaRecorder()
mMediaRecorder?.setAudioSource(recorderConfig.audioSource)
when (recorderConfig.recorderOutFormat) {
RecorderOutFormat.MPEG_4 -> {
mMediaRecorder?.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4)
mMediaRecorder?.setAudioEncoder(MediaRecorder.AudioEncoder.AAC)
}
RecorderOutFormat.AMR_WB -> {
mMediaRecorder?.setOutputFormat(MediaRecorder.OutputFormat.AMR_WB)
mMediaRecorder?.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_WB)
}
else -> {
mMediaRecorder?.reset()
mMediaRecorder?.release()
mMediaRecorder = null
return “MediaRecorder 不支持 AudioFormat.PCM”
}
}
} catch (e: IllegalStateEx