Android 12语音通话录制异常:isClientSilenced始终返回true
Android 12语音通话录制isClientSilenced始终返回true的解决方案
问题描述
在Android 12设备上,使用MediaRecorder结合VOICE_COMMUNICATION音频源录制语音通话时,即便通过AccessibilityService执行录制逻辑,AudioRecordingConfiguration.isClientSilenced()也始终返回true,导致无法正常捕获通话音频。
提供的录制代码
recorder = MediaRecorder().apply { setAudioSource(MediaRecorder.AudioSource.VOICE_COMMUNICATION) setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP) setOutputFile(fileName) setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB) registerAudioRecordingCallback(executor, object: AudioManager.AudioRecordingCallback() { override fun onRecordingConfigChanged(configs: MutableList<AudioRecordingConfiguration>?) { super.onRecordingConfigChanged(configs) configs?:return configs.forEach { LogUtil.d("isClientSilenced=${it.isClientSilenced} " + "devices=${it.audioDevice.address} " + "effect=${it.effects.size} " + "format=${it.format} " + "audioSource=${it.audioSource}") } } }) try { prepare() } catch (e: IOException) { LogUtil.d("prepare() failed") } LogUtil.d("start record") start() }
解决方案
- 完善权限配置:Android 12对通话录音权限管控更严格,除了在Manifest中声明
RECORD_AUDIO和READ_PHONE_STATE权限,还需要动态申请这两个权限。部分厂商设备还需引导用户到应用设置中开启专属的「通话录音」系统权限。 - 替换音频源尝试:将
MediaRecorder.AudioSource.VOICE_COMMUNICATION替换为MediaRecorder.AudioSource.MIC,虽然VOICE_COMMUNICATION为通话场景优化,但Android 12可能对该源强制静默。使用MIC源可录制麦克风输入,若需捕获双方通话,可配合开启扬声器播放(需额外处理回声问题)。 - 改用AudioRecord实现:AudioRecord提供更底层的音频控制能力,绕过MediaRecorder的部分限制,示例代码如下:
// 配置音频格式 val audioFormat = AudioFormat.Builder() .setEncoding(AudioFormat.ENCODING_PCM_16BIT) .setSampleRate(44100) .setChannelMask(AudioFormat.CHANNEL_IN_MONO) .build() // 计算最小缓冲区大小 val bufferSize = AudioRecord.getMinBufferSize(44100, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT) // 初始化AudioRecord val audioRecord = AudioRecord( MediaRecorder.AudioSource.VOICE_COMMUNICATION, 44100, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT, bufferSize ) // 开始录制 audioRecord.startRecording() // 读取音频数据(需在子线程执行) val buffer = ByteArray(bufferSize) while (isRecording) { val readSize = audioRecord.read(buffer, 0, bufferSize) // 将读取到的PCM数据写入文件或处理 }
- 适配前台录制要求:Android 12禁止后台无通知的录音操作,需将录制逻辑放在前台服务中,并显示前台通知,同时确保已申请
POST_NOTIFICATIONS权限。 - 适配厂商定制系统:部分国产Android 12设备(如小米、华为)有独立的通话录音管控机制,需检查系统设置中是否允许第三方应用录制通话,部分机型仅支持系统自带的通话录音功能。
内容的提问来源于stack exchange,提问作者Jiajun He
相关产品推荐
相关产品推荐

