某些应用程序如何克服电话录制限制?

and*_*per 38 audio android call-recording

背景

Android上并不支持手机录音,但有些设备在某种程度上支持它.

这使得各种呼叫录制应用收集了关于设备的可能信息以及应该对它们做什么,并决定该做什么.

有些甚至提供根解决方案.

一个这样的例子是boldbeast Call Recorder应用程序,它提供了许多不同的配置来改变:

在此输入图像描述

  • "记录模式".显示非root用户设备的14种模式,root用户最多34种模式.对于root设备,还显示"Alsa mode"作为它的选项.

  • 具有"调谐音频效果"("自动调整一组参数").

  • 具有"调谐音频路由",可能的值为"已禁用","组1","组2","组3"

  • 对于有根设备:

    • "更改音频控件"("自动更改音频控件")

    • "更改音频驱动程序"(更改音频驱动器设置以启用记录模式21,22,23,24,31,32,33,34")

    • 对于有根设备:"开始输入流"

问题

如果我需要创建一个呼叫录制应用程序,除了找到各种设备的各种解决方法之外别无他法,但似乎其他应用程序使用API​​中没有出现的术语.

例如,我找不到我提到的任何应用程序中的任何一个.

我发现了什么

除了大量关于如何在Android上录制电话的问题,显示它不适用于所有设备,我可以找到一些有趣的东西.以下是我到目前为止的尝试和见解:

  • 我们可以在准备录音时使用一些录音源(这里是文档),但遗憾的是在每个设备中它可能会有所不同.对于一些人来说,VOICE_CALL是有效的,对某些人来说也是如此.但至少我们可以尝试......

  • 在安装了Android 6.0.1的OnePlus 2上,可以使用VOICE_CALL录制来电,但是我无法在那里录制拨出电话,除非我将MIC作为音频源与扬声器开启一起使用.不知何故,我提到的应用程序成功录制它没有任何问题.我相信我会看到其他Android设备的其他问题,因为我过去曾试图解决这个问题.更新:我发现了这个示例项目(也在这里),由于某种原因,它在UI线程preparestartmediaRecorder调用之间休眠2秒.它工作正常,当我做类似的事情(等待使用Handler.postDelayed 1秒),它也工作得很好.在那里写的评论是"有时准备需要一些时间才能完成".

  • 在使用Android 8的Galaxy S7上,无论我做了什么,我都无法获得传出呼叫和来电(即使是MIC和扬声器)的另一方声音,但我提到的应用程序运行正常.

  • 为了让你尝尝我的通话录音的POC,我已经发表了开放源代码的github仓库在这里,有一个样品,将记录一个电话,让你聆听到最新的一个,如果一切运作良好.

  • 这个"ViktorDegtyarev - CallRecLib"SDK似乎根本不起作用,并在各种Android版本上崩溃

  • 这两个旧的示例项目:rvoix,esnyder-callrecorder,都无法实际记录.第二个似乎甚至不适用于它应该支持的Android 6.0.1设备.

  • aykuttasil - CallRecorder示例和 axet - android-call-recorder示例 - 两者,就像在我的POC上一样,除了AudioSource之外没有任何调整,因此他们无法记录某些情况,例如OnePlus 2输出 -拨出电话的音频.

  • 大多数第三方应用程序仅提供AudioSource调整,但有些(如"boldbeast")确实提供更多.一个例子是" 自动呼叫记录器 ",其具有"配置"(10个值可供选择,首先是"默认")和"方法"(5个值可供选择,首先是"默认").这些应用程序可能不希望其他人理解这些配置的含义,因此他们会使用通用名称.或者,它对每个人来说都太复杂了(特别是对于用户而言),所以他们概括了名称.

  • 有"setMode"的API 在这里,但它似乎并不在调用它改变.我想也许可以通过这种方式改变呼叫使用位置的"通道",但它不起作用.它在调用期间保持为"2"的值,即MODE_IN_CALL.

  • 有各种设​​备可用的自定义参数(每个OEM及其自己的参数),这些参数可以在这里设置,甚至可以通过JNI(这里这里)设置,但是我无法从哪里获取这些信息(意思是哪个)成对的键值可用).我在很多地方搜索过,但找不到任何可以参考哪些可用参数的网站,以及哪些设备.

  • 我正在考虑使用AudioRecord而不是MediaRecorder类进行录制,认为它有点低级,因此它可以为我提供更多功能和访问自定义功能,但它似乎与MediaRecorder非常相似,甚至使用相同的音频来源(例如这里).

  • 我使用低级API的另一个尝试,更进一步,使用JNI(OpenSL ES for Android).对于这一点,我找不到太多的信息(除了这里这里),只有发现谷歌的2个样本这里(被称为"音频回声"和"天然音"),这是不是录音,或者至少我不要看到它们发生.

  • Android P可能有正式的方式记录电话(在这里这里阅读).在我的Android P DP3设备(Pixel 2)上进行测试,我可以使用"DEFAULT"作为音频源,在传入和传出呼叫中记录双方都很好,因此API最终可能是官方的,适用于所有Android版本.我在这里这里写过这篇文章.

  • 我在想,也许Visualizer类可能是录音的解决方法,但根据一些StackOverflow帖子(这里),它的质量非常低,所以我决定也许我不应该尝试它.另外,我找不到如何从中录制的样本.

  • 我发现了一些参数,这可能是在某些器件上,在这里(从发现这里),全部以"AUDIO_PARAMETER_",但银河S7测试,所有返回的空字符串.我也找到了这个网站,它给了我audioManager.setParameters("noise_suppression=off")与MIC音频源一起使用的想法,但在Galaxy S7的情况下似乎没有做任何事情.

问题

与关于这个主题的其他类似问题相反,我不是在问如何记录电话.我已经知道这是一个非常棘手且复杂的问题.我已经知道我将不得不解决各种配置,并且我可能会使用服务器来存储所有这些配置,并找到每个配置的最佳匹配.

我想问的更多是关于调整和变通方法:

  1. 是否有各种设备,Android版本以及每种设备的配置列表?

  2. 除了音频源,还可以使用哪种配置?

  3. 哪些参数可用于各种设备和Android版本?是否有OEM的网站描述它们?

  4. 我提到的应用程序中的各种术语是什么?我在哪里可以找到有关如何更改它们的信息?

  5. 哪些工具可用于root设备?

  6. 是否可以通过使用API​​知道哪个设备支持呼叫录音?

  7. 关于OnePlus 2的解决方法,等待片刻直到我们开始录制,为什么需要它?是否需要所有Android版本?这是一个已知的问题吗?1秒就够了吗?

  8. 如何使用Galaxy S7即使使用MIC和扬声器,我也未能录制另一面?

and*_*per 0

根据我的测试,改进这一点的一种方法是让 AccessibilityService 处于活动状态(根本不需要在其中编写任何内容),同时选择语音识别作为音频源。此外,建议打开扬声器,因为这会录制麦克风的音频。

这似乎存在于某些通话录音应用程序中。

奇怪的是,谷歌在 Play 商店上写下了这样的规则:

Accessibility API 未设计,无法请求远程通话录音。

https://support.google.com/googleplay/android-developer/answer/11899428

不知道这里的“远程”是什么意思。

不管怎样,我已经更新了 Github 存储库以包含这些添加内容。