【问题标题】:Route audio to bluetooth A2DP device while ringing [Android]响铃时将音频路由到蓝牙 A2DP 设备 [Android]
【发布时间】:2013-04-13 23:15:53
【问题描述】:

我正在尝试确定如何在设备响铃时将非常短的音频流(通知)路由到已与设备配对的蓝牙耳机。

当我任何时候播放任何音频时,它都会被路由到蓝牙设备,没问题。 但是如果我在接收到 android.intent.action.PHONE_STATE 时尝试开始播放音频,在 RINGING 状态下,音频不会按预期路由。

我可以看到 AudioManager 的 setBluetoothA2dpOn 方法已被弃用,但我实际上尝试过但似乎没有效果。

我试过MediaRouter对象,但可以看到MediaRouter.getSelectedRoute(MediaRouter.ROUTE_TYPE_LIVE_AUDIO)在设备响铃时指向蓝牙设备的RouteInfo,AudioManager.isBluetoothA2dpOn为true。

那么,谁能告诉我为什么在铃声响起的时候音频路由是这样的?在这种情况下,有什么方法可以强制将音频路由到蓝牙设备?

[更新] 我今天再次尝试,我发现了一些可能是问题的原因。 我创建了一个 BroadcaseReceiver 来检测 android.intent.action.PHONE_STATE 的变化。如果收到意图并且状态当前正在响起,请检查 AudioManager 的模式,您会发现它是 MODE_NORMAL。但几秒钟后手机将开始真正响铃,并且模式将更改为 MODE_RINGTONE。尝试使用 setMode(AudioManager.MODE_NORMAL) 方法手动设置模式是无用的,即使将其设置为 MODE_NORMAL,状态仍保持 MODE_RINGTONE。

现在,我认为问题的原因是在 MODE_RINGTONE 模式下,所有流都被定向到手机扬声器,Android 系统没有提供改变模式的方法。

【问题讨论】:

    标签: android


    【解决方案1】:

    我认为媒体播放器会在电话响铃时释放蓝牙连接。您可以尝试获取蓝牙音频连接,看看媒体播放器现在是否通过您获得的连接播放。你可以在我的回答Using the Android RecognizerIntent with a bluetooth headset 上使用我的课程,看看它是否有效。课堂上的音频只有 Sco。

    【讨论】:

    • 感谢您的帮助,霍恩。我已经阅读了解决方案,但我认为它与我需要的相去甚远,如果我错了,请纠正我。 SCO不适合我的目标,我想我这里需要A2DP。此外,蓝牙实用程序类旨在检测蓝牙设备何时连接并采取行动。我的问题是没有检测到连接的蓝牙设备,它与在手机处于振铃模式时将音频输出重定向到蓝牙耳机而不是手机扬声器有关
    • 这完全取决于媒体播放器的功能。来电时媒体播放器可能会释放蓝牙耳机的音频连接,现在如果您获得连接并开始播放,媒体播放器可能无法检查和播放,声音然后转到您获得的蓝牙音频连接。
    • 蓝牙实用程序用于检测蓝牙耳机何时连接并获取音频连接。如果您播放非常短的声音,我认为质量并不重要。你为什么不试试,只执行 onScoAudioConntected 来播放声音。在 RINGING 上调用 mbluetoothHelper.start()。
    • 我试过了,音频开始播放到手机扬声器,而不是蓝牙耳机
    • 我猜媒体播放器会自己检查并选择扬声器。我不使用媒体播放器,所以我不知道是否可以强制媒体播放器选择蓝牙音频。当手机处于振铃状态时,通过蓝牙耳机进行文字转语音没有问题。
    【解决方案2】:

    如 StartBluetoothSco 方法的 JavaDoc 中所述:

    请注意,电话应用程序始终优先使用 SCO 连接进行电话。如果在电话通话时调用此方法,它将被忽略。同样,如果在应用程序使用 SCO 连接时接收或发送呼叫,则应用程序的连接将丢失,并且不会在呼叫结束时自动返回。`

    我尝试启动 sco,然后在正常模式下播放音乐剪辑,它可以毫无问题地播放到蓝牙耳机,尽管我无法停止导致输入流播放到耳机的麦克风。然后我尝试在音乐仍在播放时从另一部手机拨打我的目标手机,我发现流已自动重定向到手机扬声器。振铃模式完成后,流没有再次重定向到蓝牙耳机,我认为根据上面的 JavaDoc 中所述的行为是正常的。

    我的猜测是,Android 会尽可能保护振铃和通话模式,以免应用程序产生任何不必要的干扰。换句话说,当处于振铃模式时,在接听电话之前不会向耳机播放任何声音,并且您甚至无法将 AudioManager 模式从振铃模式更改为另一种模式,您的模式设置器呼叫将被忽略。

    【讨论】:

    • 我在响铃前获取了蓝牙音频,不知道在响铃状态下能否获取到音频。你可以说出声音文件,文件只需要满足一些条件。您可以查看developer.android.com/reference/android/speech/tts/…。铃声也有一些噪音,我试图消除,但到目前为止没有成功。
    【解决方案3】:

    我尝试过使用 AudioTrack 代替 MediaPlayer,但这没什么区别。

    然后我尝试了这样的 TextToSpeech 引擎:

    在主活动中,在创建时初始化:

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        textToSpeech=new TextToSpeech(this, this);
        textToSpeech.setLanguage(Locale.US);
        textToSpeech.addEarcon("[wwww]", "XXXXXXXXXXXXXXXXXXXXXXX", R.raw.a);
    }
    

    在启动蓝牙实用程序类并将以下内容添加到 onScoAudioConnected 方法时在广播接收器类中

    textToSpeech.playEarcon("[wwww]", TextToSpeech.QUEUE_FLUSH, null);
    

    这也没有用。

    【讨论】:

      猜你喜欢
      • 2011-01-09
      • 1970-01-01
      • 2018-12-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-23
      相关资源
      最近更新 更多