为什么不能在android中的语音呼叫上播放音频文件

Fal*_*lak 21 audio android phone-call

这个问题可能似乎是以下问题的重复:
如何在Android 背景音频中为语音呼叫播放音频文件以
进行正在进行的呼叫 - 可能吗?

这些问题的答案表明,在Android中的语音通话中无法播放预先录制的音频.我想知道为什么不可能?有什么限制(硬件/软件)?这是真的有限还是故意做的?我们可以改变android的源代码以使其成为可能吗?

Seb*_*ano 14

我认为这是一个限制,出于安全原因而强加于操作系统级别.

让我们首先分析安全威胁.如果您能够向被叫方播放自定义音频文件,那么整个世界的利弊开启:您可以欺骗客户支持,您可以假装成其他人,您可以提供未经授权的购买确认,等等.因此,Android和iOS都不允许此功能.

在Android上,您将无法以编程方式执行此操作,因为当前的API不允许您这样做.正如这里所指出的,它也在官方文件中说明.如果您深入了解源代码,您可以通过在电话呼叫期间访问麦克风输出来启用此功能,但这需要运行您的自定义Android版本.一个很好的起点将是AudioTrack源,可在这里.


编辑:音频模块的一个很好的例子包括将Nexus 5耳机作为第二个扬声器(需要root).可以在这里找到.

  • 我无法相信这是*安全*.我看了一部价值79美元的三星手机的内部.我很确定我可以将麦克风连接到带有两根电线的20美元数字录音机和*可能*几个电阻器,而不需要触摸软件,并且只需轻轻一按即可播放任何想要播放的音频.实际上,我可以将手机放在带有数字录音机的大型消声聚苯乙烯泡沫塑料盒中,不要以任何方式触摸*软件或硬件.我承认,我能看到的这种功能的唯一应用是恶作剧应用程序,但是:-) (2认同)

Fal*_*lak 10

经过深入研究后,我所了解的是,有一个以上的限制/障碍使其成为可能.这些限制/障碍分为三个不同的级别.

第一个限制是在API级别,因为在Android官方文档中提到的呼叫期间没有高级API来播放会话音频中的声音文件.

第二个限制是无线电接口层(RIL).RIL完全控制对Linux库的Radio Daemon(rild)的调用,然后进一步将控件传递给供应商RIL.这意味着我们无法在android源代码中操纵语音调用.

即使我们能够消除这两个限制,我们仍然无法播放音频文件到正在进行的语音通话.因为有第三个限制.每个供应商都有自己的RIL库,与Radio Daemon(rild)进行通信.这要求供应商RIL是开源的,实际上并非如此.硬件供应商通常不会提供其设备驱动程序代码.

此链接提供有关此主题的详细讨论.


cla*_*ash 5

由于 Android 中音频路由的优先级,这是与软件相关的。查看CallManager,您可以在其中深入了解该方法setAudioMode()。音频模式设置为MODE_IN_COMMUNICATION以下代码后调用

audioManager.requestAudioFocusForCall(AudioManager.STREAM_VOICE_CALL,
                        AudioManager.AUDIOFOCUS_GAIN_TRANSIENT);
Run Code Online (Sandbox Code Playgroud)

从此时起,电话服务的优先级最高,不会让任何其他音频并行播放。