为什么在Android语音通话中无法播放音频文件

27

1
当我接到来电时,我可以在另一个应用程序从通知中创建声音时进行听取。 - Tapa Save
这不是在同一端听录音,而是为远程方播放某些内容。 - Nasir Iqbal
当我使用MXPlayer观看视频并有人打电话给我时,当我接听电话时,视频会暂停1秒钟,然后再次播放,因此可能会在语音通话中有声音播放。 - Morteza Soleimani
5个回答

20

我认为这是一种限制,出于安全原因在操作系统层面上受到了限制。

首先,让我们分析安全威胁。如果你能够向被叫方播放自定义音频文件,就会打开一个全新的缺口:你可以欺骗客户支持,你可以冒充别人,你可以给未经授权的购买确认等等。因此,Android和iOS都不允许这种功能存在。

在Android上,你无法以编程方式执行此操作,因为当前的API不允许您这样做。官方文档也指出了这一点,如此处所示。如果您深入挖掘源代码,可能可以通过在电话通话期间访问麦克风输出来启用此功能,但这需要运行您定制的Android版本。一个好的起点是AudioTrack源代码,在这里可用


编辑:一个很好的音频修改示例涉及将Nexus 5耳机扬声器作为第二个扬声器(需要root)。可以在此处找到。


关于安全性问题,我们已经考虑到了所有这些,事实上,现代通信方式本身就是一个安全威胁,请参阅我们的博客http://www.ictinnovations.com/growing-use-of-voip-requires-additional-anti-terrorism-measures - Nasir Iqbal
好的,但这就是为什么会有这个限制的原因。 - Sebastiano
实际上,我想知道这个限制在哪里。如果它与软件有关,那么为什么没有人成功地克服它(请记住,Android是开源的)? - Nasir Iqbal
并不是说,在代码的某个地方,你可以取消注释几行代码并启用此功能。它根本不存在。没有音频输出目标可以连接到电话线路输出,因此您需要重写Android框架的一部分(在C++级别上)以添加此音频输出并实现您想要的功能。 - Sebastiano
3
我简直不敢相信这就是所谓的“安全性”。我看过一款价值79美元的三星手机的内部结构,我很确定我可以用两根电线、也许再加上几个电阻器,将麦克风连接到一个20美元的数字录音机上,而且完全不需要触碰任何软件,只需轻按一个开关就可以播放任何我想要的音频。实际上,我甚至可以将手机装在一个大的无反射聚苯乙烯泡沫箱中,配上一个数字录音机,而且完全不需要触碰任何软件或硬件。虽然我承认,我所能想到这种功能的唯一应用就是恶作剧应用程序 :-) - LSerni

16
经过深入研究,我了解到实现此功能存在不止一种限制和障碍。这些限制和障碍存在于三个不同的层面。 第一个限制是在API层面上,因为如Android官方文档所述,在通话期间播放声音文件的高级API不存在。 第二个限制在无线电接口层(RIL)上。RIL将通话的完全控制权转交给Linux库的Radio Daemon(rild),后者又将控制权进一步转交给供应商的RIL。这意味着我们无法在Android源代码中操作语音通话。
即使我们能够消除这两个限制,我们仍然可能无法向正在进行的语音通话播放音频文件,因为存在第三个限制。每个供应商都有自己的RIL库,与Radio Daemon(rild)通信。这要求供应商的RIL必须是开源的,但实际上并非如此。硬件供应商通常不会公开其设备驱动程序代码。
有关此主题的详细讨论可参考此链接

5

这与安卓中音频路由的优先级设置有关。可以查看CallManager,在其中可以深入研究方法setAudioMode()。在将音频模式设置为MODE_IN_COMMUNICATION之后,会调用以下代码。

audioManager.requestAudioFocusForCall(AudioManager.STREAM_VOICE_CALL,
                        AudioManager.AUDIOFOCUS_GAIN_TRANSIENT);

从此时开始,电话服务具有最高优先级,不会允许任何其他音频并行播放。

0

0
通过实现AudioManager.OnAudioFocusChangeListener,您可以获取audiomanager的状态。因此,如果后台正在播放任何音乐,则可以获取AudioManager状态(播放和暂停完全由开发人员控制)同样......
Android设备中的一些本地音乐播放器在处理此问题时,当呼叫处于TelephonyManager.EXTRA_STATE_OFFHOOK状态时,它们会限制音乐。因此,这种情况也完全由开发人员控制(是否处理)。如果他没有处理,两者将同时播放。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接