这个问题可能似乎是以下问题的重复:
How to play an audio file on a voice call in android
Background Audio for a Call in Progress - Possible?
这些问题的答案表明,在Android中的语音通话中无法播放预先录制的音频。我想知道为什么不可能?有什么限制(硬件/软件)?这是真的有限还是故意做的?我们可以改变android的源代码以使其成为可能吗?
答案 0 :(得分:14)
我认为这是一个限制,出于安全原因而强加于操作系统级别。
首先让我们分析一下安全威胁。如果您能够向被叫方播放自定义音频文件,整个世界的利弊开放:您可以欺骗客户支持,您可以假装成其他人,您可以提供未经授权的购买确认,以及等等。出于这个原因,Android和iOS都不允许这种功能。
在Android上,您无法以编程方式执行此操作,只是因为当前的API不会允许您这样做。正如here所指出的那样,它也在官方文件中说明。如果您深入了解源代码,您可以通过在电话呼叫期间访问麦克风输出来启用此功能,但这需要运行您的自定义Android版本。一个很好的起点是AudioTrack
来源,available here。
编辑:音频模式的一个很好的例子包括将Nexus 5耳机作为第二个扬声器(需要root)。可以找到here。
答案 1 :(得分:10)
经过深入研究后,我所知道的是,有一个以上的限制/障碍使其成为可能。这些限制/障碍分为三个不同的级别。
第一个限制处于API级别,因为在Android official documentation中提到的呼叫期间,没有高级API可以在会话音频中播放声音文件。
第二个限制位于无线电接口层(RIL)。 RIL完全控制对Linux库的Radio Daemon(rild)的调用,然后进一步将控件传递给供应商RIL。这意味着我们无法在android源代码中操纵语音调用。
即使我们能够消除这两个限制,我们仍然无法播放正在进行语音通话的音频文件。因为有第三个限制。每个供应商都有自己的RIL库,与Radio Daemon(rild)进行通信。这要求供应商RIL是开源的,实际上并非如此。硬件供应商通常不会提供其设备驱动程序代码。
有关此主题的详细讨论见this link。
答案 2 :(得分:4)
由于Android中音频路由的优先级,这与软件相关。
查看CallManager,您可以在其中深入了解方法setAudioMode()
。音频模式设置为MODE_IN_COMMUNICATION
后,将调用以下代码
audioManager.requestAudioFocusForCall(AudioManager.STREAM_VOICE_CALL,
AudioManager.AUDIOFOCUS_GAIN_TRANSIENT);
从这一点开始,电话服务具有最高优先级,并且不会让任何其他音频并行播放。
答案 3 :(得分:0)
注意:您只能将音频数据播放到标准输出设备。目前,这是移动设备扬声器或蓝牙耳机。在通话过程中,您无法在对话音频中播放声音文件。
参见官方链接 http://developer.android.com/guide/topics/media/mediaplayer.html
答案 4 :(得分:0)
通过实现AudioManager.OnAudioFocusChangeListener,您可以获得audiomanager的状态。所以,如果在背景中播放任何音乐,你可以获得AudioManager状态(播放和暂停完全在开发人员手中)......
Android设备中的一些原生音乐播放器在处理此问题时,它们会在TelephonyManager.EXTRA_STATE_OFFHOOK中调用时限制音乐。因此,如果他不处理这两种情况,这种情况也完全在开发人员手中(无论是否处理)将并行播放