Cómo administrar llamadas con la API de Telecom

En esta guía, se explica cómo enrutar audio para dispositivos Bluetooth con el Telecom API y configura la conexión para Llamadas VoIP Lee el Guía para compilar una app de llamadas antes de continuar.

Mediante ConnectionService y Connection, puedes acceder el estado de audio y una lista de los dispositivos Bluetooth disponibles, y puede enrutar audio a un dispositivo Bluetooth seleccionado.

VoIP Connection y ConnectionService

Crea una clase VoIPConnection que se extienda de Connection Esta clase controla el estado de la llamada actual. Como Guía para compilar una app de llamadas haz que esta sea una aplicación autoadministrada y establece el modo de audio para una y mantener la integridad de su aplicación.

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 un elemento se produce 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 estos Connection personalizados y ConnectionService clases, tú puedes controlar qué dispositivo y qué tipo de enrutamiento de audio deseas utilizar durante una llamada.

Obtén el estado de audio actual

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

mAudioState = connection.getCallAudioState()

Cuando se cambió el estado

Anula la suscripción a los cambios en CallAudioState onCallAudioStateChanged() Esto te alertará de 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

Obtener una lista de 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]);

Con el nivel de API 23 y versiones posteriores

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

setAudioRoute(CallAudioState.ROUTE_BLUETOOTH);