You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Android 5.1以上版本通话录音无法采集对方声音问题求助

解决Android 5.1+通话录音仅能录制己方声音的问题

嘿,这个问题我帮不少开发者踩过坑!Android 5.1(API 22)之后,系统对通话录音的限制变严格了,咱们先来理清楚原因,再一步步解决:

问题根源

在Android 5.1以下,MediaRecorder.AudioSource.MIC可以同时捕获通话双方的声音,因为当时系统没有严格隔离通话音频通道。但5.1+版本中,通话对方的声音走的是专门的系统音频路由,普通MIC只能采集到手机麦克风附近的声音(也就是你自己说话的声音),无法触及对方的通话音频流。

可行的解决方案

1. 尝试使用通话专属音频源VOICE_CALL

Android提供了MediaRecorder.AudioSource.VOICE_CALL这个专门针对通话录音的音频源,理论上可以捕获双方声音。但注意:这个源需要系统签名或者ROOT权限,从Android 6.0开始,普通应用调用它会直接抛出权限异常。如果你的应用是系统级或者面向ROOT用户,可以试试:

recorder = new MediaRecorder();
recorder.setOutputFile(f.getAbsolutePath());
recorder.setAudioSource(MediaRecorder.AudioSource.VOICE_CALL); // 替换原来的MIC
recorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
recorder.prepare();
recorder.start();

2. 兼容性更好的替代:VOICE_COMMUNICATION

如果拿不到系统/ROOT权限,优先试试MediaRecorder.AudioSource.VOICE_COMMUNICATION——这个是为语音通话场景优化的音频源,不需要特殊权限,部分设备上可以同时捕获双方声音:

recorder.setAudioSource(MediaRecorder.AudioSource.VOICE_COMMUNICATION);

不过要注意,这个效果依设备而异,比如小米、华为等国内厂商的定制系统可能还是会限制,需要实际测试。

3. 用底层AudioRecord尝试捕获

MediaRecorder是封装好的API,灵活性不够,换成更底层的AudioRecord可能在某些设备上绕过限制。你需要自己处理PCM数据的编码(比如转成AAC/MP3),示例代码:

// 配置参数
int sampleRate = 44100;
int channelConfig = AudioFormat.CHANNEL_IN_STEREO;
int audioFormat = AudioFormat.ENCODING_PCM_16BIT;
int bufferSize = AudioRecord.getMinBufferSize(sampleRate, channelConfig, audioFormat);

// 初始化AudioRecord
AudioRecord audioRecord = new AudioRecord(
        MediaRecorder.AudioSource.VOICE_COMMUNICATION,
        sampleRate,
        channelConfig,
        audioFormat,
        bufferSize
);

// 开始录音(之后需要自己读取PCM数据并编码)
audioRecord.startRecording();

4. 权限和通话状态监听

别忘了确保权限齐全:

  • 静态声明权限(在AndroidManifest.xml):
    <uses-permission android:name="android.permission.RECORD_AUDIO" />
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    
  • Android 6.0+动态申请RECORD_AUDIO权限:
    if (ContextCompat.checkSelfPermission(this, Manifest.permission.RECORD_AUDIO) != PackageManager.PERMISSION_GRANTED) {
        ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.RECORD_AUDIO}, 1001);
    }
    

另外,监听通话状态(比如通过TelephonyManager),确保只在通话进行时启动录音,避免无效录制。

最后说句实在话

Android 5.1+之后没有通用的完美解决方案,因为系统和各大厂商都对通话录音做了严格限制。如果某些设备还是无法录到对方声音,建议引导用户开启手机自带的通话录音功能,这是最可靠的方式。

内容的提问来源于stack exchange,提问作者harsh sharma

火山引擎 最新活动