Управляйте звонками с помощью Telecom API

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

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

VoIP-соединение и ConnectionService

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

Котлин

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

Ява

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

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

Котлин

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

Ява

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() . Это предупреждает вас о любых изменениях в состоянии.

Котлин

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

Ява

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

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

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

Котлин

val activeDevice: BluetoothDevice = mAudioState.getActiveBluetoothDevice()

Ява

BluetoothDevice activeDevice = mAudioState.getActiveBluetoothDevice();

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

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

Котлин

val availableBluetoothDevices: Collection =
  mAudioState.getSupportedBluetoothDevices()

Ява

Collection availableBluetoothDevices = mAudioState.getSupportedBluetoothDevices();

Направить звук вызова

Направьте звук вызова на доступное устройство Bluetooth с помощью requestBluetoothAudio(BluetoothDevice) :

requestBluetoothAudio(availableBluetoothDevices[0]);

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

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

setAudioRoute(CallAudioState.ROUTE_BLUETOOTH);