Android Marshmallow及以上版本通话录音问题
我非常理解你的困扰——Android 6.0之后Google对通话录音的限制确实给开发者带来了不少麻烦,毕竟之前的MediaRecorder.AudioSource.VOICE_CALL用起来太顺手了。下面我结合行业内的实践经验,给你几个可行的方向:
核心原因先搞清楚
首先得明确:Android 6.0+开始,Google出于隐私保护的考虑,把VOICE_CALL这个音频源的访问权限限制给了系统签名应用或者厂商预装应用,第三方普通APP直接调用这个参数肯定会失败,这就是你遇到问题的根本原因。而Play上那些能正常工作的APP,大多是做了针对性的厂商适配,甚至拿到了厂商的特殊权限。
可行解决方案
1. 针对不同厂商适配私有音频源
很多主流手机厂商(小米、华为、三星、OPPO等)都提供了自己的私有音频源参数,用来绕开系统的通用限制。举几个例子:
- 小米部分机型可以尝试使用
MediaRecorder.AudioSource.VOICE_COMMUNICATION,或者直接用私有常量值(比如旧版VOICE_CALL对应的3,不过不同机型可能有变化) - 华为部分机型支持
com.android.internal.media.AudioSystem.HW_VOICE_CALL这个私有常量(需要反射调用,因为是内部API) - 三星部分机型可以试试
MediaRecorder.AudioSource.VOICE_UPLINK和VOICE_DOWNLINK分别录制上下行声音,再合并文件
注意:这些私有参数没有统一标准,你需要针对不同品牌、不同系统版本的机型做大量测试,而且可能随着厂商系统更新失效,需要持续维护适配规则。
2. Android 10+使用REMOTE_SUBMIX音频源
Android 10及以上版本提供了MediaRecorder.AudioSource.REMOTE_SUBMIX,这个音频源可以捕获系统输出的所有音频,自然也包括通话双方的声音。使用它需要几个关键步骤:
- 申请必要权限:
RECORD_AUDIO、WRITE_EXTERNAL_STORAGE(Android 13+还要加POST_NOTIFICATIONS) - 必须启动前台服务:因为Android后台限制,后台录音会被系统强制停止
- 获取录屏权限:这个音频源依赖
MediaProjectionManager的录屏授权(虽然你只需要录音,但系统要求必须走这个授权流程)
简单的代码示例:
// 初始化MediaRecorder MediaRecorder recorder = new MediaRecorder(); recorder.setAudioSource(MediaRecorder.AudioSource.REMOTE_SUBMIX); recorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4); recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC); recorder.setOutputFile(getExternalFilesDir(null) + "/call_recording.mp4"); // 准备并开始录音 try { recorder.prepare(); recorder.start(); } catch (IOException e) { e.printStackTrace(); }
缺点是需要用户授权录屏权限,部分厂商可能会额外限制这个功能的使用。
3. 音频路由技巧(谨慎使用)
有些APP会通过临时调整音频路由来实现录音,但这个方法兼容性极差,而且很多厂商已经封堵了。比如先通过AudioManager把音频路由切到扬声器,用MIC录到双方声音后再切回正常模式,但这不符合你“非扬声器模式”的需求。不过你可以尝试一些更隐蔽的路由操作,比如:
AudioManager audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE); audioManager.setMode(AudioManager.MODE_IN_CALL); audioManager.setSpeakerphoneOn(false);
但这个方法在很多新机型上已经失效,只能作为补充尝试。
4. Root权限方案(不推荐)
如果你的目标用户是Root用户,可以通过修改系统权限文件或者调用系统级API来获取VOICE_CALL的访问权限,但这会大幅缩小应用的受众,而且违反Google Play的上架政策,除非你只面向Root用户分发应用。
最后总结
Play上的通话录音APP能正常工作,核心是他们做了大量的机型适配,针对不同厂商的系统定制了不同的录音策略。你需要投入精力去收集不同机型的适配方案,甚至可以做一个机型检测模块,根据用户的手机品牌和系统版本自动选择对应的录音方案。
内容的提问来源于stack exchange,提问作者Kishor




