You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 12:34:52