Cómo administrar llamadas con la API de Telecom

En esta guía, se explica cómo enrutar audio para dispositivos Bluetooth con la API de Telecom y configurar la conexión para llamadas de VoIP. Antes de continuar, lee la guía Cómo compilar una app de llamadas.

Cuando usas las clases ConnectionService y Connection, puedes acceder al estado de audio y a una lista de dispositivos Bluetooth disponibles, además de enrutar el audio a un dispositivo Bluetooth seleccionado.

Conexión y ConnectionService de VoIP

Crea una clase VoIPConnection que se extienda desde Connection. Esta clase controla el estado de la llamada actual. Como se indica en la guía Cómo compilar una app de llamada, haz que esta sea una aplicación autoadministrada y configura el modo de audio para una aplicación de 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);
  }
}

A continuación, muestra una instancia de esta clase en ConnectionService cuando se produzca una llamada entrante o saliente.

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

Asegúrate de que el manifiesto apunte correctamente a la clase 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>

Con estas clases personalizadas de Connection y ConnectionService, puedes controlar qué dispositivo y qué tipo de enrutamiento de audio deseas usar durante una llamada.

Cómo obtener el estado actual del audio

Para obtener el estado del audio actual, llama a getCallAudioState(). Se muestra getCallAudioState() si el dispositivo está transmitiendo con Bluetooth, Auricular, Con cable o Bocina.

mAudioState = connection.getCallAudioState()

Cuando se cambia el estado

Suscribirse a los cambios en CallAudioState anulando onCallAudioStateChanged(). Esto te alerta sobre cualquier cambio en el estado.

Kotlin

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

Java

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

Obtén el dispositivo actual

Obtén el dispositivo activo actual con CallAudioState.getActiveBluetoothDevice(). Esta función muestra el dispositivo Bluetooth activo.

Kotlin

val activeDevice: BluetoothDevice = mAudioState.getActiveBluetoothDevice()

Java

BluetoothDevice activeDevice = mAudioState.getActiveBluetoothDevice();

Obtener dispositivos Bluetooth

Obtén una lista de los dispositivos Bluetooth disponibles para el enrutamiento de audio de llamadas mediante CallAudioState.getSupportedBluetoothDevices().

Kotlin

val availableBluetoothDevices: Collection =
  mAudioState.getSupportedBluetoothDevices()

Java

Collection availableBluetoothDevices = mAudioState.getSupportedBluetoothDevices();

Enrutar el audio de la llamada

Enruta el audio de la llamada a un dispositivo Bluetooth disponible mediante requestBluetoothAudio(BluetoothDevice):

requestBluetoothAudio(availableBluetoothDevices[0]);

Uso del nivel de API 23 y versiones posteriores

Habilita ROUTE_BLUETOOTH sin especificar el dispositivo mediante setAudioRoute(int). De forma predeterminada, el enrutamiento a dispositivos Bluetooth actuales y activos en Android 9 y versiones posteriores

setAudioRoute(CallAudioState.ROUTE_BLUETOOTH);