Руководство по самостоятельному переносу данных с помощью Менеджера аудио

Это руководство предназначено для разработчиков приложений для связи, например VoIP, которые хотят самостоятельно управлять состоянием аудио и наушников.

Регистрация обратного вызова Audio

Сначала создайте AudioDeviceCallback, который будет уведомлять приложение о подключении аудиоустройств к устройству или отключении от него.

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

Проверьте, есть ли активное устройство связи

Менеджер аудио показывает, какое устройство связи сейчас активно.

Kotlin

val currentCommunicationDevice: AudioDeviceInfo? = audioManager.communicationDevice

Java

AudioDeviceInfo currentCommunicationDevice = audioManager.getCommunicationDevice();

Отслеживание изменений в устройстве связи позволяет приложению узнавать, когда применяется маршрутизация и когда выбранное устройство активно.

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

Используйте getAvailableCommuncationDevices(), чтобы узнать, какие устройства доступны для VoIP-вызова. Используйте AudioDeviceInfo, чтобы проверить, является ли устройство гарнитурой BLE. В этом примере выполняется поиск первого устройства, поддерживающего BLE Audio, но вы также можете найти все поддерживаемые устройства и разрешить пользователям выбирать.

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

Установить устройство связи

Найдя совместимое устройство, используйте setCommunicationDevice, чтобы задать устройство, на которое вы хотите перенаправить вызов. Проверка результата позволяет приложению узнать, пытается ли аудиоменеджер настроить устройство или произошла ошибка.

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)

Теперь, когда аудиоустройство BLE настроено, при совершении вызова аудиопоток будет иметь правильную маршрутизацию.

Завершить сеанс

После завершения вызова или сеанса очистите активное устройство связи. Это помогает обеспечить удобство работы при переходе между разными приложениями.

Kotlin


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

Java


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