Gerenciar ligações usando a API Telecom

Este guia explica como rotear áudio para dispositivos Bluetooth usando a API Telecom e definir a conexão para chamadas VoIP. Leia o guia Criar um app de chamadas antes de continuar.

Ao usar as classes ConnectionService e Connection, é possível acessar o estado do áudio e uma lista de dispositivos Bluetooth disponíveis, além de rotear áudio para um dispositivo Bluetooth selecionado.

Conexão VoIP e ConnectionService

Crie uma classe VoIPConnection que se estenda de Connection. Essa classe controla o estado da chamada atual. De acordo com as instruções do guia Criar um app de chamada, torne esse aplicativo autogerenciado e configure o modo de áudio para um aplicativo VIP.

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);
  }
}

Em seguida, retorne uma instância dessa classe em ConnectionService quando ocorrer uma chamada recebida ou realizada.

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();
  }
}

Verifique se o manifesto aponta corretamente para a classe 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>

Com essas classes personalizadas Connection e ConnectionService, é possível controlar qual dispositivo e que tipo de roteamento de áudio você quer usar durante uma chamada.

Conferir o estado atual do áudio

Para saber o estado atual do áudio, chame getCallAudioState(). getCallAudioState() retorna se o dispositivo está fazendo streaming usando Bluetooth, minifone de ouvido, com fio ou alto-falante.

mAudioState = connection.getCallAudioState()

No estado alterado

Inscreva-se para receber mudanças no CallAudioState substituindo onCallAudioStateChanged(). Isso alerta você sobre quaisquer alterações no estado.

Kotlin

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

Java

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

Obter o dispositivo atual

Consiga o dispositivo ativo atual usando CallAudioState.getActiveBluetoothDevice(). Essa função retorna o dispositivo Bluetooth ativo.

Kotlin

val activeDevice: BluetoothDevice = mAudioState.getActiveBluetoothDevice()

Java

BluetoothDevice activeDevice = mAudioState.getActiveBluetoothDevice();

Instalar dispositivos Bluetooth

Consulte uma lista de dispositivos Bluetooth disponíveis para o roteamento de áudio de chamadas usando CallAudioState.getSupportedBluetoothDevices().

Kotlin

val availableBluetoothDevices: Collection =
  mAudioState.getSupportedBluetoothDevices()

Java

Collection availableBluetoothDevices = mAudioState.getSupportedBluetoothDevices();

Encaminhar o áudio da chamada

Encaminhe o áudio da chamada para um dispositivo Bluetooth disponível usando requestBluetoothAudio(BluetoothDevice):

requestBluetoothAudio(availableBluetoothDevices[0]);

Como usar o nível 23 da API ou mais recente

Ative ROUTE_BLUETOOTH sem especificar o dispositivo usando setAudioRoute(int). Esse recurso define o roteamento padrão para dispositivos Bluetooth atuais e ativos no Android 9 e versões mais recentes.

setAudioRoute(CallAudioState.ROUTE_BLUETOOTH);