Аудиопрофили Bluetooth на основе Bluetooth с низким энергопотреблением (BLE) Audio позволяют осуществлять двунаправленную потоковую передачу высококачественного звука (например, стереозвука с частотой дискретизации 32 кГц). Это стало возможным благодаря созданию изохронного канала LE (ISO). ISO похож на синхронный канал с установлением соединения (SCO), поскольку в нем также используется зарезервированная пропускная способность беспроводной связи. Однако ее резервирование больше не ограничено 64 Кбит/с и может динамически корректироваться.
Для ввода аудио через Bluetooth можно использовать последнюю версию AudioManager API почти во всех случаях, кроме телефонных звонков. В этом руководстве рассказывается, как записывать стереоаудио с помощью наушников BLE Audio.
Настройка приложения
Сначала настройте приложение для работы с нужным SDK в файле build.gradle:
targetSdkVersion 31
Регистрация обратного вызова Audio
Создайте AudioDeviceCallback, чтобы приложение получало уведомления о подключении и отключении AudioDevices.
final AudioDeviceCallback audioDeviceCallback = new AudioDeviceCallback() {
@Override
public void onAudioDevicesAdded(AudioDeviceInfo[] addedDevices) {
};
@Override
public void onAudioDevicesRemoved(AudioDeviceInfo[] removedDevices) {
// Handle device removal
};
};
audioManager.registerAudioDeviceCallback(audioDeviceCallback);
Найти аудиоустройство BLE
Получите список всех подключенных аудиоустройств с поддержкой ввода, а затем используйте getType(), чтобы проверить, является ли устройство гарнитурой, с помощью AudioDeviceInfo.TYPE_BLE_HEADSET.
Kotlin
val allDeviceInfo = audioManager.getDevices(GET_DEVICES_INPUTS) var bleInputDevice: AudioDeviceInfo? = null for (device in allDeviceInfo) { if (device.type == AudioDeviceInfo.TYPE_BLE_HEADSET) { bleInputDevice = device break } }
Java
AudioDeviceInfo[] allDeviceInfo = audioManager.getDevices(GET_DEVICES_INPUTS); AudioDeviceInfo bleInputDevice = null; for (AudioDeviceInfo device : allDeviceInfo) { if (device.getType() == AudioDeviceInfo.TYPE_BLE_HEADSET) { bleInputDevice = device; break; } }
Поддержка стерео
Чтобы проверить, поддерживаются ли стереомикрофоны на выбранном устройстве, посмотрите, есть ли у него два или более каналов. Если у устройства только один канал, установите маску канала на моно.
Kotlin
var channelMask: Int = AudioFormat.CHANNEL_IN_MONO if (audioDevice.channelCounts.size >= 2) { channelMask = AudioFormat.CHANNEL_IN_STEREO }
Java
if (bleInputDevice.getChannelCounts() >= 2) { channelMask = AudioFormat.CHANNEL_IN_STEREO; };
Как настроить запись аудио
Диктофоны можно настроить с помощью стандартного конструктора AudioRecord.
Используйте маску канала, чтобы выбрать стерео- или моноконфигурацию.
Kotlin
val recorder = AudioRecord.Builder() .setAudioSource(MediaRecorder.AudioSource.MIC) .setAudioFormat(AudioFormat.Builder() .setEncoding(AudioFormat.ENCODING_PCM_16BIT) .setSampleRate(32000) .setChannelMask(channelMask) .build()) .setBufferSizeInBytes(2 * minBuffSizeBytes) .build()
Java
AudioRecord recorder = new AudioRecord.Builder() .setAudioSource(MediaRecorder.AudioSource.MIC) .setAudioFormat(new AudioFormat.Builder() .setEncoding(AudioFormat.ENCODING_PCM_16BIT) .setSampleRate(32000) .setChannelMask(channelMask) .build()) .setBufferSizeInBytes(2*minBuffSizeBytes) .build();
Как настроить устройство по умолчанию
Указав устройство по умолчанию, вы сообщите аудио-recorder, какое аудиоустройство вы хотите использовать для записи.
Kotlin
recorder.preferredDevice = audioDevice
Java
recorder.setPreferredDevice(bleInputDevice);
Теперь вы можете записывать аудио, как описано в руководстве по MediaRecorder.