Gérer les appels avec l'API Telecom

Ce guide explique comment acheminer l'audio pour les appareils Bluetooth à l'aide de l'API Telecom et comment définir la connexion pour les appels VoIP. Lisez le guide Créer une application appelante avant de continuer.

En utilisant les classes ConnectionService et Connection, vous pouvez accéder à l'état du son et à la liste des appareils Bluetooth disponibles, et acheminer le contenu audio vers un appareil Bluetooth sélectionné.

Service de connexion et de connexion VoIP

Créez une classe VoIPConnection qui s'étend à partir de Connection. Cette classe contrôle l'état de l'appel en cours. Comme indiqué dans le guide Créer une application appelante, définissez cette application autogérée et définissez le mode audio pour une application 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);
  }
}

Renvoyez ensuite une instance de cette classe dans ConnectionService lorsqu'un appel entrant ou sortant se produit.

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

Assurez-vous que le fichier manifeste pointe correctement vers la 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>

Ces classes Connection et ConnectionService personnalisées vous permettent de contrôler l'appareil et le type de routage audio que vous souhaitez utiliser lors d'un appel.

Obtenir l'état de l'audio actuel

Pour obtenir l'état audio actuel, appelez getCallAudioState(). getCallAudioState() renvoie la valeur si l'appareil diffuse du contenu en streaming via le Bluetooth, l'écouteur, le câblage ou l'enceinte.

mAudioState = connection.getCallAudioState()

Lors du changement d'état

Abonnez-vous aux modifications dans CallAudioState en remplaçant onCallAudioStateChanged(). Vous êtes ainsi averti de tout changement de l'état.

Kotlin

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

Java

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

Obtenir l'appareil actuel

Obtenez l'appareil actif actuel à l'aide de CallAudioState.getActiveBluetoothDevice(). Cette fonction renvoie l'appareil Bluetooth actif.

Kotlin

val activeDevice: BluetoothDevice = mAudioState.getActiveBluetoothDevice()

Java

BluetoothDevice activeDevice = mAudioState.getActiveBluetoothDevice();

Obtenir des appareils Bluetooth

Obtenez la liste des appareils Bluetooth disponibles pour le routage audio des appels à l'aide de CallAudioState.getSupportedBluetoothDevices().

Kotlin

val availableBluetoothDevices: Collection =
  mAudioState.getSupportedBluetoothDevices()

Java

Collection availableBluetoothDevices = mAudioState.getSupportedBluetoothDevices();

Diriger l'audio de l'appel

Acheminez l'audio de l'appel vers un appareil Bluetooth disponible à l'aide de requestBluetoothAudio(BluetoothDevice):

requestBluetoothAudio(availableBluetoothDevices[0]);

Utiliser le niveau d'API 23 ou supérieur

Activez ROUTE_BLUETOOTH sans spécifier l'appareil à l'aide de setAudioRoute(int). Par défaut, le routage est effectué vers les appareils Bluetooth actifs actuels sur Android 9 ou version ultérieure.

setAudioRoute(CallAudioState.ROUTE_BLUETOOTH);