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




