Selbstverwaltete Anrufe im Audio-Manager

In diesem Leitfaden geht es um Kommunikationsanwendungen wie Voice over Internet Protocol (VoIP), die den Status von Audio- und Hörgeräten selbst verwalten möchten.

Sprachrückruf registrieren

Erstelle zuerst eine AudioDeviceCallback, die deine App benachrichtigt, wenn Audiogeräte eine Verbindung mit dem Gerät herstellen oder trennen.

Kotlin

val audioDeviceCallback: AudioDeviceCallback = object : AudioDeviceCallback() {
  override fun onAudioDevicesAdded(addedDevices: Array) {}
  override fun onAudioDevicesRemoved(removedDevices: Array) {}
}

audioManager.registerAudioDeviceCallback(audioDeviceCallback)

Java

final AudioDeviceCallback audioDeviceCallback = new AudioDeviceCallback() {
  @Override
  public void onAudioDevicesAdded(AudioDeviceInfo[] addedDevices) {
  }

  @Override
  public void onAudioDevicesRemoved(AudioDeviceInfo[] removedDevices) {
    // Handle device removal
  }
};

audioManager.registerAudioDeviceCallback(audioDeviceCallback);

Nach aktivem Kommunikationsgerät suchen

Im Audio-Manager sehen Sie, welches Kommunikationsgerät gerade aktiv ist.

Kotlin

val currentCommunicationDevice: AudioDeviceInfo? = audioManager.communicationDevice

Java

AudioDeviceInfo currentCommunicationDevice = audioManager.getCommunicationDevice();

Wenn ein Kommunikationsgerät auf eine Änderung reagiert wird, weiß die App, wann das Routing angewendet wird und das ausgewählte Gerät aktiv ist.

Kotlin

val listener =
  OnCommunicationDeviceChangedListener { device -> // Handle changes
    currentCommunicationDevice = device
  }
audioManager.addOnCommunicationDeviceChangedListener(executor, listener)

Java

AudioManager.OnCommunicationDeviceChangedListener listener = 
      new AudioManager.OnCommunicationDeviceChangedListener() {
  @Override
  void onCommunicationDeviceChanged(AudioDeviceInfo device) {
      // Handle changes
      currentCommunicationDevice = device;
  }
};
AudioManager.addOnCommunicationDeviceChangedListener(executor, listener);

BLE-Audiogerät suchen

Mit getAvailableCommuncationDevices() können Sie sehen, welche Geräte für einen VoIP-Anruf verfügbar sind. Verwende AudioDeviceInfo, um zu prüfen, ob das Gerät ein BLE-Headset ist. In diesem Beispiel wird nach dem ersten Gerät gesucht, das BLE Audio unterstützt. Sie können aber auch alle unterstützten Geräte ermitteln und den Nutzern die Wahl lassen.

Kotlin


// Get list of currently available devices
val devices = audioManager.availableCommunicationDevices

// User choose one of the devices, let's say, TYPE_BLE_HEADSET
val userSelectedDeviceType = AudioDeviceInfo.TYPE_BLE_HEADSET

//for the device from the list
var selectedDevice: AudioDeviceInfo? = null
for (device in devices) {
  if (device.type == userSelectedDeviceType) {
    selectedDevice = device
    break
  }
}

Java


// Get list of currently available devices
List devices = audioManager.getAvailableCommunicationDevices();

// User choose one of the devices, for example, TYPE_BLE_HEADSET
int userSelectedDeviceType = AudioDeviceInfo.TYPE_BLE_HEADSET;

// Filter for the device from the list
AudioDeviceInfo selectedDevice = null;
for (AudioDeviceInfo device : devices) {
    if (device.getType() == userSelectedDeviceType) {
        selectedDevice = device;
        break;
    }
}

Kommunikationsgerät festlegen

Wenn Sie ein kompatibles Gerät gefunden haben, legen Sie mit setCommunicationDevice das Gerät fest, zu dem Sie die Weiterleitung einrichten möchten. Wenn Sie dieses Ergebnis anklicken, wird Ihre App darüber informiert, ob der Audio-Manager versucht, das Gerät einzurichten, oder ob ein Fehler aufgetreten ist.

Kotlin


val result = audioManager.setCommunicationDevice(selectedDevice)
if (!result) {
  // Handle error.
}
// Wait for currentCommunicationDevice to become selectedDevice with a timeout (e.g. 30s)

Java


boolean result = audioManager.setCommunicationDevice(selectedDevice);
if (!result) {
  // Handle error.
}
// Wait for currentCommunicationDevice to become selectedDevice with a timeout (e.g. 30s)

Nachdem das BLE Audio-Gerät eingerichtet wurde, weist der Audiostream beim Tätigen eines Anrufs das richtige Audiorouting auf.

Sitzung beenden

Nachdem Ihre App einen Anruf oder eine Sitzung beendet hat, löschen Sie das aktive Kommunikationsgerät. Dies trägt dazu bei, dass der Wechsel zwischen verschiedenen Anwendungen für die Nutzenden angenehm ist.

Kotlin


// Clear the selection, ready for next call
audioManager.clearCommunicationDevice()

Java


// Clear the selection, ready for next call
audioManager.clearCommunicationDevice();