Zarządzanie wywołaniami przy użyciu interfejsu Telecom API

Z tego przewodnika dowiesz się, jak kierować dźwięk na urządzenia Bluetooth za pomocą interfejsu Telecom API oraz konfigurować połączenie na potrzeby połączeń VoIP. Zanim przejdziesz dalej, przeczytaj przewodnik Tworzenie aplikacji do rozmów.

Klasy ConnectionService i Connection dają dostęp do stanu dźwięku i listy dostępnych urządzeń Bluetooth, a także umożliwiają kierowanie dźwięku na wybrane urządzenie Bluetooth.

Połączenie i usługa połączeń VoIP

Utwórz zajęcia VoIPConnection, które wykraczają poza zakres Connection. Ta klasa kontroluje stan bieżącego wywołania. Zgodnie z instrukcjami w przewodniku Tworzenie aplikacji do połączeń utwórz aplikację jako samodzielnie zarządzaną i ustaw tryb audio dla aplikacji 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);
  }
}

Następnie w momencie wystąpienia połączenia przychodzącego lub wychodzącego zwróć wystąpienie tej klasy w zadaniu ConnectionService.

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

Upewnij się, że plik manifestu prawidłowo wskazuje klasę 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>

Dzięki tym niestandardowym klasom Connection i ConnectionService możesz określić, którego urządzenia i jakiego routingu dźwięku chcesz używać podczas połączenia.

Pobierz bieżący stan dźwięku

Aby sprawdzić bieżący stan dźwięku, wywołaj metodę getCallAudioState(). getCallAudioState() zwraca wartość, jeśli urządzenie odtwarza treści strumieniowo przez Bluetooth, słuchawkę, przewodową lub głośnik.

mAudioState = connection.getCallAudioState()

Zmiana stanu

Zasubskrybuj zmiany w CallAudioState, zastępując fragment onCallAudioStateChanged(). Będzie to informować o wszelkich zmianach stanu.

Kotlin

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

Java

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

Weź bieżące urządzenie

Pobierz aktualne aktywne urządzenie, korzystając z metody CallAudioState.getActiveBluetoothDevice(). Ta funkcja zwraca aktywne urządzenie Bluetooth.

Kotlin

val activeDevice: BluetoothDevice = mAudioState.getActiveBluetoothDevice()

Java

BluetoothDevice activeDevice = mAudioState.getActiveBluetoothDevice();

Pobierz urządzenia Bluetooth

Uzyskaj listę urządzeń Bluetooth, które są dostępne do kierowania dźwięku połączeń przy użyciu CallAudioState.getSupportedBluetoothDevices().

Kotlin

val availableBluetoothDevices: Collection =
  mAudioState.getSupportedBluetoothDevices()

Java

Collection availableBluetoothDevices = mAudioState.getSupportedBluetoothDevices();

Kierowanie dźwięku połączenia

Kieruj dźwięk połączenia na dostępne urządzenie Bluetooth za pomocą requestBluetoothAudio(BluetoothDevice):

requestBluetoothAudio(availableBluetoothDevices[0]);

Używanie interfejsu API na poziomie 23 lub wyższym

Włącz ROUTE_BLUETOOTH bez określania urządzenia za pomocą metody setAudioRoute(int). To ustawienie domyślne powoduje kierowanie na obecne, aktywne urządzenia Bluetooth na Androidzie 9 i nowszych.

setAudioRoute(CallAudioState.ROUTE_BLUETOOTH);