问题描述

iOS 或Android 设备连接蓝牙设备后,通话时出现不能通过蓝牙设备出声的现象。具体现象如下:
连接蓝牙耳机后,接听电话无法通过蓝牙耳机出声。连接蓝牙音箱后,通话中无法通过蓝牙音箱录音或播放声音。

iOS 设备

问题原因

上述问题可能由以下三种原因造成:
iOS 系统会为系统通话和 VoIP 通话选择音频路由。系统通话包括使用电话、FaceTime 和CallKit 框架的 app 进行的通话。
系统通话的系统默认设置
连接蓝牙设备后:
如果用户在 iPhone 设备上按接听键,则默认使用 iPhone 听筒接听电话;如果用户在蓝牙设备上按接听键,则默认使用蓝牙设备接听电话。
VoIP 通话的系统默认设置
连接蓝牙设备后:
如果进行过系统通话或 VoIP 通话,则默认使用最后一次系统通话或 VoIP 通话使用的音频路由接听电话。如果没有进行过系统通话,则默认使用蓝牙设备接听电话。
iOS 设备上输入和输出的音频路由必须相同。只有当用户或 app 指定蓝牙设备为输入或输出的音频路由时,系统才会默认把输出或输入的音频路由也设置为蓝牙设备。
蓝牙音箱的录音功能只有在进行系统通话时才可以使用。如果 app 未使用 CallKit 框架,则频道内发流的用户无法使用蓝牙音箱录音或播放声音,不发流的用户仅可使用蓝牙音箱播放声音。

解决方案

你可以根据实际通话场景,使用对应的方法,来设置语音播放路由。
系统通话
在开始系统通话前,在iPhone 的设置中修改音频通话方式:向下滑动以显示搜索栏,搜索音频通话方式,并将音频通话方式设为蓝牙耳机。这样系统来电时即使按手机上的接听键,也会默认使用蓝牙耳机接听电话。
在进行系统通话过程中,用户也可以通过通话界面的外放按钮自行切换蓝牙、听筒或外放。
如果通话时连接的蓝牙设备为蓝牙音箱,请确保 app 使用 CallKit 框架,方可使用上述方法设置语音播放路由。
VoIP 通话
在开始 VoIP 通话前,用户可以通过系统控制中心自行切换音频路由为蓝牙设备。app 则可以调用 iOS 原生 APIsetPreferredInput方法切换音频路由为蓝牙设备。当使用蓝牙耳机进行 VoIP 通话时,收到了系统来电,则点蓝牙耳机上的接听按钮接听系统来电,系统通话结束后再切回 app 就能保持使用蓝牙耳机进行通话。

Android 设备

问题原因

未在AndroidManifest.xml文件中添加使用蓝牙设备的权限。只有支持 SCO 协议的蓝牙设备,才支持录制和播放音频。如果蓝牙设备只支持 A2DP 协议,则无法录制音频,那么用户就无法使用该蓝牙设备通话。只有 Android 设备支持在未进行系统通话时使用蓝牙 SCO,才能将语音路由切换为蓝牙设备。

解决方案

在AndroidManifest.xml文件中添加如下行,获取使用蓝牙设备的权限:
确认蓝牙设备是否支持 SCO 协议。如果不支持,切换支持 SCO 协议的蓝牙设备。
调用 Android 原生 APIAudioManmager.isBluetoothScoAvailableOffCall方法判断该 Android 设备是否支持在没有系统通话时使用蓝牙 SCO。如果设备不支持该功能,则无法将音频路由切换为蓝牙设备,只能使用系统默认的路由接听电话。