Управление вызовами с помощью Telecom API

В этом руководстве рассказывается, как маршрутизировать аудио для устройств Bluetooth с помощью Telecom API и настраивать подключение для VoIP-вызовов. Прежде чем продолжить, ознакомьтесь с руководством Как создать приложение для звонков.

С помощью классов ConnectionService и Connection можно получить доступ к состоянию аудио и списку доступных устройств Bluetooth, а также направить аудио на выбранное устройство Bluetooth.

Подключение VoIP и ConnectionService

Создайте класс VoIPConnection, расширяющий Connection. Этот класс управляет состоянием текущего вызова. Как указано в руководстве Создание приложения для звонков, сделайте это приложение самоуправляемым и задайте аудиорежим для приложения VoIP.

Kotlin

class VoIPConnection : Connection() {
  init {
    setConnectionProperties(PROPERTY_SELF_MANAGED)
    setAudioModeIsVoip(true)
  }
}

Java

public class VoIPConnection extends Connection {
  public VoIPConnection() {
    setConnectionProperties(PROPERTY_SELF_MANAGED);
    setAudioModeIsVoip(true);
  }
}

Затем возвращайте экземпляр этого класса в ConnectionService при входящем или исходящем вызове.

Kotlin

class VoIPConnectionService : ConnectionService() {
  override fun onCreateOutgoingConnection(
    connectionManagerPhoneAccount: PhoneAccountHandle,
    request: ConnectionRequest,
  ): Connection {
    return VoIPConnection()
  }
}

Java

public class VoIPConnectionService extends ConnectionService {
  @Override
  public Connection onCreateOutgoingConnection(PhoneAccountHandle connectionManagerPhoneAccount, ConnectionRequest request) {
    return new VoIPConnection();
  }
}

Убедитесь, что манифест правильно указывает на класс VoIPConnectionService.

<service android:name=".voip.TelegramConnectionService" android:permission="android.permission.BIND_TELECOM_CONNECTION_SERVICE">
  <intent-filter>
    <action android:name="android.telecom.ConnectionService"/>
  </intent-filter>
</service>

С помощью этих пользовательских классов Connection и ConnectionService вы можете управлять тем, какое устройство и какой тип маршрутизации аудио вы хотите использовать во время звонка.

Как получить текущее состояние звука

Чтобы получить текущее состояние аудио, вызовите getCallAudioState(). getCallAudioState() возвращает информацию о том, как устройство передает аудио: через Bluetooth, динамик, проводное подключение или колонку.

mAudioState = connection.getCallAudioState()

При изменении состояния

Подпишитесь на изменения в CallAudioState, переопределив onCallAudioStateChanged(). Это позволяет вам узнавать о любых изменениях в состоянии.

Kotlin

fun onCallAudioStateChanged(audioState: CallAudioState) {
  mAudioState = audioState
}

Java

@Override
public void onCallAudioStateChanged(CallAudioState audioState) {
  mAudioState = audioState;
}

Получить текущее устройство

Получите текущее активное устройство с помощью CallAudioState.getActiveBluetoothDevice(). Эта функция возвращает активное устройство Bluetooth.

Kotlin

val activeDevice: BluetoothDevice = mAudioState.getActiveBluetoothDevice()

Java

BluetoothDevice activeDevice = mAudioState.getActiveBluetoothDevice();

Получить устройства Bluetooth

Получите список устройств Bluetooth, доступных для маршрутизации аудиовызовов, с помощью CallAudioState.getSupportedBluetoothDevices().

Kotlin

val availableBluetoothDevices: Collection =
  mAudioState.getSupportedBluetoothDevices()

Java

Collection availableBluetoothDevices = mAudioState.getSupportedBluetoothDevices();

Маршрутизация звука вызова

Перенаправьте аудиовызов на доступное устройство Bluetooth с помощью requestBluetoothAudio(BluetoothDevice).

requestBluetoothAudio(availableBluetoothDevices[0]);

Использование API уровня 23 и выше

Включите ROUTE_BLUETOOTH, не указывая устройство с помощью setAudioRoute(int). По умолчанию маршрутизация выполняется на текущие активные устройства Bluetooth на Android 9 и более поздних версиях.

setAudioRoute(CallAudioState.ROUTE_BLUETOOTH);