Gestire le chiamate tramite l'API Telecom

Questa guida spiega come indirizzare l'audio per i dispositivi Bluetooth utilizzando l'API Telecom e come impostare la connessione per le chiamate VoIP. Leggi la guida Creazione di un'app per le chiamate prima di continuare.

Utilizzando le classi ConnectionService e Connection, puoi accedere allo stato audio e a un elenco dei dispositivi Bluetooth disponibili, nonché indirizzare l'audio a un dispositivo Bluetooth selezionato.

Connessione VoIP e ConnectionService

Crea una classe VoIPConnection che si estende da Connection. Questa classe controlla lo stato della chiamata in corso. Come indicato nella guida Crea un'app per le chiamate, configura questa applicazione autogestita e imposta la modalità audio per un'applicazione 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);
  }
}

Quindi, restituisci un'istanza di questa classe in ConnectionService quando si verifica una chiamata in arrivo o in uscita.

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

Assicurati che il manifest rimandi correttamente alla 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>

Con queste classi personalizzate Connection e ConnectionService, puoi controllare quale dispositivo e quale tipo di routing audio vuoi utilizzare durante una chiamata.

Recupero dello stato dell'audio attuale

Per conoscere lo stato audio attuale, chiama getCallAudioState(). getCallAudioState() viene visualizzato se il dispositivo trasmette in streaming tramite Bluetooth, auricolare, cavo o altoparlante.

mAudioState = connection.getCallAudioState()

Stato alla modifica

Iscriviti alle modifiche in CallAudioState eseguendo l'override di onCallAudioStateChanged(). Ti avvisa di eventuali modifiche dello stato.

Kotlin

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

Java

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

Prendi il dispositivo attuale

Scarica il dispositivo attivo corrente utilizzando CallAudioState.getActiveBluetoothDevice(). Questa funzione restituisce il dispositivo Bluetooth attivo.

Kotlin

val activeDevice: BluetoothDevice = mAudioState.getActiveBluetoothDevice()

Java

BluetoothDevice activeDevice = mAudioState.getActiveBluetoothDevice();

Ottieni dispositivi Bluetooth

Visualizza un elenco dei dispositivi Bluetooth disponibili per il routing audio delle chiamate utilizzando CallAudioState.getSupportedBluetoothDevices().

Kotlin

val availableBluetoothDevices: Collection =
  mAudioState.getSupportedBluetoothDevices()

Java

Collection availableBluetoothDevices = mAudioState.getSupportedBluetoothDevices();

Indirizzare l'audio della chiamata

Indirizza l'audio della chiamata a un dispositivo Bluetooth disponibile utilizzando requestBluetoothAudio(BluetoothDevice):

requestBluetoothAudio(availableBluetoothDevices[0]);

Utilizzo del livello API 23 e successivi

Attiva ROUTE_BLUETOOTH senza specificare il dispositivo utilizzando setAudioRoute(int). Per impostazione predefinita, viene eseguito il routing ai dispositivi Bluetooth attuali e attivi su Android 9 e versioni successive.

setAudioRoute(CallAudioState.ROUTE_BLUETOOTH);