问题描述
iOS 或 Android 设备连接蓝牙设备后,通话时出现不能通过蓝牙设备出声的现象。具体现象如下:
- 连接蓝牙耳机后,接听电话无法通过蓝牙耳机出声。
- 连接蓝牙音箱后,通话中无法通过蓝牙音箱录音或播放声音。
iOS 设备
问题原因
上述问题可能由以下原因造成:
原因 | 描述 |
---|
iOS 系统会为系统通话和 VoIP 通话选择音频路由 | 系统通话包括使用电话、FaceTime 和 CallKit 框架的 app 进行的通话。系统通话的系统默认设置:(连接蓝牙设备后)- 如果用户在 iPhone 设备上按接听键,则默认使用 iPhone 听筒接听电话
- 如果用户在蓝牙设备上按接听键,则默认使用蓝牙设备接听电话
VoIP 通话的系统默认设置:(连接蓝牙设备后)- 如果进行过系统通话或 VoIP 通话,则默认使用最后一次系统通话或 VoIP 通话使用的音频路由接听电话
- 如果没有进行过系统通话,则默认使用蓝牙设备接听电话
|
iOS 设备上输入和输出的音频路由必须相同 | 只有当用户或 app 指定蓝牙设备为输入或输出的音频路由时,系统才会默认把输出或输入的音频路由也设置为蓝牙设备 |
蓝牙音箱的录音功能只有在进行系统通话时才可以使用 | 如果 app 未使用 CallKit 框架,则频道内发流的用户无法使用蓝牙音箱录音或播放声音,不发流的用户仅可使用蓝牙音箱播放声音 |
解决方案
你可以根据实际通话场景,使用对应的方法,来设置语音播放路由。
解决方案 | 解决方式 |
---|
系统通话 | 在开始系统通话前,在 iPhone 的设置中修改音频通话方式:向下滑动以显示搜索栏,搜索音频通话方式,并将音频通话方式设为蓝牙耳机。这样系统来电时即使按手机上的接听键,也会默认使用蓝牙耳机接听电话。 在进行系统通话过程中,用户也可以通过通话界面的外放按钮自行切换蓝牙、听筒或外放。如果通话时连接的蓝牙设备为蓝牙音箱,请确保 app 使用 CallKit 框架,方可使用上述方法设置语音播放路由。 |
VoIP 通话 | 在开始 VoIP 通话前,用户可以通过系统控制中心自行切换音频路由为蓝牙设备。app 则可以调用 iOS 原生 API setPreferredInput 方法切换音频路由为蓝牙设备。当使用蓝牙耳机进行 VoIP 通话时,收到了系统来电,则点蓝牙耳机上的接听按钮接听系统来电,系统通话结束后再切回 app 就能保持使用蓝牙耳机进行通话。 |
Android 设备
问题原因
原因 | 描述 |
---|
未添加使用蓝牙设备的权限 | 未在 AndroidManifest.xml 文件中添加使用蓝牙设备的权限。 |
蓝牙设备不支持 SCO 协议 | 只有支持 SCO 协议的蓝牙设备,才支持录制和播放音频。如果蓝牙设备只支持 A2DP 协议,则无法录制音频,那么用户就无法使用该蓝牙设备通话。 |
设备不支持 | 只有 Android 设备支持在未进行系统通话时使用蓝牙 SCO,才能将语音路由切换为蓝牙设备。 |
解决方案
解决方案 | 解决方式 |
---|
添加使用蓝牙设备的权限 | 在 AndroidManifest.xml 文件中添加如下行,获取使用蓝牙设备的权限:<uses-permission android:name="android.permission.BLUETOOTH" /> 、<uses-permission android:name="android.permission.READ_PHONE_STATE" /> |
蓝牙设备支持 SCO 协议 | 确认蓝牙设备是否支持 SCO 协议。如果不支持,切换支持 SCO 协议的蓝牙设备 |
设备支持 | 调用 Android 原生 API AudioManmager.isBlluetoothScoAvailableOffCall 方法判断该 Android 设备是否支持在没有系统通话时使用蓝牙 SCO。如果设备不支持该功能,则无法将音频路由切换为蓝牙设备,只能使用系统默认的路由接听电话。 |