Aufrufe mit der Telecom API verwalten

In dieser Anleitung wird beschrieben, wie Sie Audio für Bluetooth-Geräte mithilfe der Telecom API weiterleiten und die Verbindung für VoIP-Anrufe einrichten. Lesen Sie die Anleitung zum Erstellen einer Anruf-App, bevor Sie fortfahren.

Mithilfe der Klassen ConnectionService und Connection können Sie auf den Audiostatus und eine Liste der verfügbaren Bluetooth-Geräte zugreifen und Audioinhalte an ein ausgewähltes Bluetooth-Gerät weiterleiten.

VoIP Connection und ConnectionService

Erstellen Sie eine VoIPConnection-Klasse, die über Connection erweitert wird. Diese Klasse steuert den Status des aktuellen Anrufs. Wie im Leitfaden zum Erstellen einer Anruf-App beschrieben, machen Sie die App zu einer selbstverwalteten Anwendung und legen Sie den Audiomodus für eine VoIP-Anwendung fest.

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

Als Nächstes wird bei einem ein- oder ausgehenden Anruf eine Instanz dieser Klasse in ConnectionService zurückgegeben.

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

Achten Sie darauf, dass das Manifest korrekt auf die Klasse VoIPConnectionService verweist.

<service android:name=".voip.TelegramConnectionService" android:permission="android.permission.BIND_TELECOM_CONNECTION_SERVICE">
  <intent-filter>
    <action android:name="android.telecom.ConnectionService"/>
  </intent-filter>
</service>

Mit diesen benutzerdefinierten Klassen Connection und ConnectionService können Sie steuern, welches Gerät und welche Art von Audiorouting Sie während eines Anrufs verwenden möchten.

Aktuellen Audiostatus abrufen

Rufen Sie getCallAudioState() auf, um den aktuellen Audiostatus abzurufen. getCallAudioState() wird zurückgegeben, wenn das Gerät über Bluetooth, Kopfhörer, kabelgebunden oder über einen Lautsprecher streamt.

mAudioState = connection.getCallAudioState()

Bei Status geändert

Sie können die Änderungen an CallAudioState abonnieren, indem Sie onCallAudioStateChanged() überschreiben. Dadurch werden Sie über Statusänderungen informiert.

Kotlin

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

Java

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

Aktuelles Gerät herunterladen

Rufen Sie das aktuell aktive Gerät mit CallAudioState.getActiveBluetoothDevice() ab. Diese Funktion gibt das aktive Bluetooth-Gerät zurück.

Kotlin

val activeDevice: BluetoothDevice = mAudioState.getActiveBluetoothDevice()

Java

BluetoothDevice activeDevice = mAudioState.getActiveBluetoothDevice();

Bluetooth-Geräte kaufen

Mit CallAudioState.getSupportedBluetoothDevices() lässt sich eine Liste der Bluetooth-Geräte abrufen, die für das Audiorouting von Anrufen verfügbar sind.

Kotlin

val availableBluetoothDevices: Collection =
  mAudioState.getSupportedBluetoothDevices()

Java

Collection availableBluetoothDevices = mAudioState.getSupportedBluetoothDevices();

Audio für Anruf weiterleiten

Audio des Anrufs mit requestBluetoothAudio(BluetoothDevice) an ein verfügbares Bluetooth-Gerät weiterleiten:

requestBluetoothAudio(availableBluetoothDevices[0]);

API-Level 23 oder höher wird verwendet

Aktivieren Sie ROUTE_BLUETOOTH, ohne das Gerät mit setAudioRoute(int) anzugeben. Dadurch wird das Routing zu aktuellen, aktiven Bluetooth-Geräten unter Android 9 und höher standardmäßig aktiviert.

setAudioRoute(CallAudioState.ROUTE_BLUETOOTH);