如何捕获或重新路由导航语音流

时间:2012-12-21 03:51:27

标签: android stream bluetooth

在Android上使用带有蓝牙设备的Google导航时出现问题。导航通过A2DP流发送用于逐向指令的音频。我有一个摩托罗拉T605蓝牙车载套件,它支持HFP和A2DP。我经常只是听老式汽车收音机。在这种情况下,我从未听过转弯指示,因为我的直播A2DP流正被发送到无线电AUX输入,但我正在收听广播。我的应用程序有一个功能,它向我发送短信。我已将其设置为您可以选择要用于此的流。我更喜欢使用AudioManager.STREAM_VOICE_CALL,因为它在T605上使用专用的独立扬声器。

我已经研究了几种方法来解决这个问题:

1)重新通知蓝牙SCO而不是A2DP。我没有资助这样做的方法。我能够发送我在这条路径上创建的TTS消息并且它工作得很好(我的应用程序中内置了一个SMS阅读器)。我尝试过激活SCO,但是转弯指令流会移动到手机内置扬声器而不是我喜欢的语音呼叫流。

2)捕获导航消息并通过SCO路径回显它们。我找不到拦截或捕获导航流的方法。 Google Navigation是否使用TTS引擎或其自己的方法来创建语音输出?在文本字符串中获取方向会很棒,因为我可以轻松地将其发送到TTS引擎并将其路由到我想要的地方,就像我使用SMS字符串一样。

您可以在此处查看我的应用来源:http://code.google.com/p/a2dpvolume/

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

不幸的是,在将导航消息重新路由到BT SCO时,我认为你是SOOL。我希望导航应用程序使用TTS或NOTIFICATION流类型来播放消息,并且这两种流类型都遵循MEDIA路由策略(对于通知,当没有活动的语音呼叫时,至少通常是真的)。 p>

虽然行为由每个供应商决定,但我猜你会发现在大多数实现中,遵循MEDIA路由策略的流将不会被路由到BT SCO,除非在正在进行的语音呼叫期间被路由到BT SCO。

在路由方面,您可以做的最好的事情是强制路由到扬声器,或者“除了A2DP之外的任何东西”(这意味着如果连接了有线耳机,或者连接了扬声器)。

以下是你如何做到这一点(我还没有证实这适用于那里的每部手机):

Class audioSystemClass = Class.forName("android.media.AudioSystem");
Method setForceUse = audioSystemClass.getMethod("setForceUse",
    int.class,
    int.class);
// 1 == FOR_MEDIA, 10 == FORCE_NO_BT_A2DP (FORCE_SPEAKER would be 1).
setForceUse.invoke(null, 1, 10);