将音频流传输到Android电话通话

27

我正在尝试在Android上通过电话呼叫发送音频流。

例如,创建一个应用程序,播放一些自定义的等候音乐,或接听电话并播放录音/音频文件。我知道可以让应用程序自动接听电话,但能否将音频发送给呼叫者呢?

如果可能的话,请告诉我哪些类/函数可以处理此操作。

6个回答

27
写入电话流是可能的,但在股票(非root)手机上不能从应用程序级别进行。当启动电话呼叫时,麦克风通常直接路由到基带,即完全跳过主处理器(具体取决于特定手机)。对于输出音频:麦克风->编解码器->基带,对于输入音频:基带->编解码器->扬声器。如果总是路由为:麦克风->编解码器->主处理器->编解码器->基带,则流“可能”可用,如果Android API(框架)支持访问它。我说它是可能的原因是因为几乎所有智能手机的音频都通过SlimBus连接。这允许动态更改音频路径。但是,它是通过位于ALSA中的编解码器驱动程序在内核中完成的。
所以......如果你非常有动力,你可以获取手机Linux内核的源代码,并修改编解码器/ALSA驱动程序,以允许你更改呼叫音频路径设置时发生的情况。当然,这样做会导致新路径的延迟,打破AT&T制定的呼叫/延迟标准(Audience帮助他们编写...),基带芯片可能会拒绝你的音频,因为它不及时。最后,你需要修改Android源代码(框架)来扩展API,以支持将音频注入该流。(你需要对mediaserver、audioflinger进行大量修改...)虽然很复杂,但这就是你的答案。干杯,:-)

1
可以给我们一些示例代码,说明如何在通话期间实现流式传输,或者提供一些参考链接吗? - Feroz Siddiqui
@FerozSiddiqui,你找到了相同的例子吗?如果是的话,能否请您分享一下... - Krunal Indrodiya
还没有,仍然没有一个可行的解决方案。 - Feroz Siddiqui

2
这一定是可能的,因为手机允许通过蓝牙将音频作为麦克风发送。
由于我需要解决这个问题,我的一个想法是将蓝牙信号“伪装”成麦克风输入发送给自己。
另一个想法(如果糟糕请原谅)是将扬声器反向使用作为麦克风。由于似乎扬声器可以访问所需的硬件,可能有一种方法可以通过这种方式注入音频数据流。
由于我完全是在使用SDK上进行编码的新手,请原谅本帖的初步错误,我/我们会在解决问题时更新。

还没有时间,但注意到谷歌现在也这样做了。 - Tim Hallman
蓝牙的想法很有趣。 - bormat

1
我知道已经有一些应用程序可以将系统的所有音频发送到手机的耳机,即使您在媒体播放器中播放的歌曲也不需要root或任何其他特殊权限。
经过一些研究,我发现这可以使用音频管理器(Audio Manager)类完成。例如:
 AudioManager audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
 audioManager.setMode(AudioManager.MODE_IN_COMMUNICATION);
 audioManager.setSpeakerphoneOn(false);

为什么不将默认输出扬声器设置为设备耳机,然后使用 MediaPlayer 类播放音频呢?

0
获取音频数据是非常可能的,但将音频写入上游通道是不可能的。

0

捕获远程混音音频需要CAPTURE_AUDIO_OUTPUT权限。该权限为系统组件使用保留,不可供第三方应用程序使用:(


-4

很抱歉,无法将数据写入电话通话流。


3
没有什么是不可能的。 - Tim Hallman

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