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

Android Marshmallow及以上版本通话录音问题

解决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_UPLINKVOICE_DOWNLINK分别录制上下行声音,再合并文件

注意:这些私有参数没有统一标准,你需要针对不同品牌、不同系统版本的机型做大量测试,而且可能随着厂商系统更新失效,需要持续维护适配规则。

2. Android 10+使用REMOTE_SUBMIX音频源

Android 10及以上版本提供了MediaRecorder.AudioSource.REMOTE_SUBMIX,这个音频源可以捕获系统输出的所有音频,自然也包括通话双方的声音。使用它需要几个关键步骤:

  • 申请必要权限:RECORD_AUDIOWRITE_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

火山引擎 最新活动