# 为什么 iOS 或 Android 设备连接蓝牙设备后不能通过蓝牙设备接电话？ (/zh-CN/reference/faq/quality/ios_bluetooth)

> For AI agents: see the complete documentation index at [llms.txt](/llms.txt).

## 问题描述 [#问题描述]

iOS 或 Android 设备连接蓝牙设备后，通话时出现不能通过蓝牙设备出声的现象。具体现象如下：

- 连接蓝牙耳机后，接听电话无法通过蓝牙耳机出声。
- 连接蓝牙音箱后，通话中无法通过蓝牙音箱录音或播放声音。

## iOS 设备 [#ios-设备]

### 问题原因 [#问题原因]

上述问题可能由以下三种原因造成：

1. iOS 系统会为系统通话和 VoIP 通话选择音频路由。系统通话包括使用电话、FaceTime 和 CallKit 框架的 App 进行的通话。

   **系统通话的系统默认设置**

   连接蓝牙设备后：

   - 如果用户在 iPhone 设备上按接听键，则默认使用 iPhone 听筒接听电话；
   - 如果用户在蓝牙设备上按接听键，则默认使用蓝牙设备接听电话。

   **VoIP 通话的系统默认设置**

   连接蓝牙设备后：

   - 如果进行过系统通话或 VoIP 通话，则默认使用最后一次系统通话或 VoIP 通话使用的音频路由接听电话。
   - 如果没有进行过系统通话，则默认使用蓝牙设备接听电话。

2. iOS 设备上输入和输出的音频路由必须相同。只有当用户或 App 指定蓝牙设备为输入或输出的音频路由时，系统才会默认把输出或输入的音频路由也设置为蓝牙设备。

3. 蓝牙音箱的录音功能只有在进行系统通话时才可以使用。如果 App 未使用 CallKit 框架，则频道内发流的用户无法使用蓝牙音箱录音或播放声音，不发流的用户仅可使用蓝牙音箱播放声音。

### 解决方案 [#解决方案]

你可以根据实际通话场景，使用对应的方法，来设置语音播放路由。

**系统通话**

- 在开始系统通话前，在 iPhone 的**设置**中修改音频通话方式：向下滑动以显示搜索栏，搜索**音频通话方式**，并将**音频通话方式**设为**蓝牙耳机**。这样系统来电时即使按手机上的接听键，也会默认使用蓝牙耳机接听电话。

  ![](https://web-cdn.agora.io/docs-files/1599030147631) ![](https://web-cdn.agora.io/docs-files/1599030217188)

- 在进行系统通话过程中，用户也可以通过通话界面的外放按钮自行切换蓝牙、听筒或外放。
- 如果通话时连接的蓝牙设备为蓝牙音箱，请确保 App 使用 CallKit 框架，方可使用上述方法设置语音播放路由。

**VoIP 通话**

- 在开始 VoIP 通话前，用户可以通过系统控制中心自行切换音频路由为蓝牙设备。app 则可以调用 iOS 原生 API  `setPreferredInput` 方法切换音频路由为蓝牙设备。
- 当使用蓝牙耳机进行 VoIP 通话时，收到了系统来电，则点蓝牙耳机上的接听按钮接听系统来电，系统通话结束后再切回 App 就能保持使用蓝牙耳机进行通话。

## Android 设备 [#android-设备]

### 问题原因 [#问题原因-1]

1. 如果你使用的是 v4.1.0 之前版本的 SDK，需要在 `AndroidManifest.xml` 文件中添加使用蓝牙设备的权限。
2. 只有支持 SCO 协议的蓝牙设备，才支持录制和播放音频。如果蓝牙设备只支持 A2DP 协议，则无法录制音频，那么用户就无法使用该蓝牙设备通话。
3. 只有 Android 设备支持在未进行系统通话时使用蓝牙 SCO，才能将语音路由切换为蓝牙设备。

### 解决方案 [#解决方案-1]

1. 在 `AndroidManifest.xml` 文件中添加如下行，获取使用蓝牙设备的权限：

   ```java
   <uses-permission android:name="android.permission.BLUETOOTH" />
   <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
   <uses-permission android:name="android.permission.READ_PHONE_STATE" />
	 <!-- 如果你使用的是 Android 12.0 及以上设备，还需要添加如下权限： -->
   <uses-permission android:name="android.permission.BLUETOOTH_CONNECT"/>
   ```

2. 确认蓝牙设备是否支持 SCO 协议。如果不支持，切换支持 SCO 协议的蓝牙设备。

3. 调用 Android 原生 API `AudioManmager.isBluetoothScoAvailableOffCall` 方法判断该 Android 设备是否支持在没有系统通话时使用蓝牙 SCO。如果设备不支持该功能，则无法将音频路由切换为蓝牙设备，只能使用系统默认的路由接听电话。
