Przewodnik po samodzielnym zarządzaniu rozmowami w Menedżerze dźwięku

Ten przewodnik dotyczy aplikacji komunikacyjnych, takich jak VoIP (Voice over Internet Protocol), które chcą samodzielnie zarządzać dźwiękiem i stanem urządzenia słyszalnego.

Rejestrowanie wywołania zwrotnego

Najpierw utwórz AudioDeviceCallback, który powiadamia aplikację, gdy urządzenia audio łączą się z urządzeniem lub rozłączają się.

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

Sprawdź, czy jest aktywne urządzenie komunikacyjne

Menedżer dźwięku informuje, które urządzenie komunikacyjne jest obecnie aktywne.

Kotlin

val currentCommunicationDevice: AudioDeviceInfo? = audioManager.communicationDevice

Java

AudioDeviceInfo currentCommunicationDevice = audioManager.getCommunicationDevice();

Nasłuchiwanie powiadomień o zmianie urządzenia komunikacyjnego informuje aplikację o zastosowaniu routingu i o tym, że wybrane urządzenie jest aktywne.

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

Znajdź urządzenie audio BLE

Sprawdź w getAvailableCommuncationDevices(), z których urządzeń możesz prowadzić rozmowy VoIP. Użyj AudioDeviceInfo, aby sprawdzić, czy urządzenie to zestaw słuchawkowy BLE. W tym przykładzie szukamy pierwszego urządzenia obsługującego BLE Audio, ale możesz też znaleźć wszystkie obsługiwane urządzenia i dać użytkownikom wybór.

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

Ustaw urządzenie komunikacyjne

Po znalezieniu zgodnego urządzenia użyj funkcji setCommunicationDevice, aby ustawić urządzenie, na które chcesz kierować ruch. Sprawdzanie wyniku informuje aplikację, czy menedżer dźwięku próbuje skonfigurować urządzenie lub czy wystąpił błąd.

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)

Po skonfigurowaniu urządzenia BLE Audio podczas nawiązywania połączenia strumień audio będzie miał prawidłowy routing.

Zakończ sesję

Gdy aplikacja zakończy połączenie lub sesję, wyczyść aktywne urządzenie komunikacyjne. Zapewnia to wygodę użytkownikom korzystającym z różnych aplikacji.

Kotlin


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

Java


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