1

使用蓝牙设备在 Android 上使用 Google Navigation 时出现问题。导航通过 A2DP 流发送转弯指示的音频。我有一个摩托罗拉 T605 蓝牙车载套件,它支持 HFP 和 A2DP。不过,我经常只听老式汽车收音机。在这种情况下,我从来没有听到转弯指示,因为我的实时 A2DP 流被发送到收音机 AUX 输入,但我正在收听收音机。我的应用程序具有向我读出 SMS 消息的功能。我已经设置好了,因此您可以选择要用于此的流。我更喜欢使用 AudioManager.STREAM_VOICE_CALL,因为它在 T605 上使用了一个专用的独立扬声器。

我研究了几种方法来处理这个问题:

1) 将通知重新路由到蓝牙 SCO 而不是 A2DP。我还没有资助一种方法来做到这一点。我可以通过这条路径发送我创建的 TTS 消息,并且效果很好(我的应用程序中内置了一个 SMS 阅读器)。我尝试激活 SCO,但转向指令流移动到手机内部扬声器,而不是我喜欢的语音呼叫流。

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

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

有什么想法吗?

4

1 回答 1

1

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

尽管行为由每个供应商决定,但我猜你会发现在大多数实现中遵循 MEDIA 路由策略的流永远不会路由到 BT SCO,除非在路由到的正在进行的语音呼叫期间英国电信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);
于 2012-12-21T14:29:21.717 回答