Gravação de áudio

Perfis de áudio Bluetooth baseados no áudio Bluetooth de baixa energia (BLE) permitem um streaming bidirecional de áudio de alta qualidade (por exemplo, áudio estéreo com taxa de amostragem de 32 kHz). Isso é possível graças à criação da LE Canal isócrono (ISO). O ISO é semelhante ao modo síncrono (SCO) porque também usa largura de banda sem fio reservada, mas a largura de banda reserva não tem mais limite de 64 Kbps e pode ser ajustada dinamicamente.

A entrada de áudio Bluetooth pode usar API AudioManager para quase todos os usos os casos, exceto chamadas telefônicas. Este guia aborda como gravar áudio estéreo de Áudio BLE auditável.

Configurar seu aplicativo

Primeiro, configure seu aplicativo para direcionar o SDK correto em build.gradle:

targetSdkVersion 31

Registrar callback de áudio

Crie um AudioDeviceCallback que informa ao aplicativo as mudanças nos dispositivos AudioDevices.

final AudioDeviceCallback audioDeviceCallback = new AudioDeviceCallback() {
  @Override
  public void onAudioDevicesAdded(AudioDeviceInfo[] addedDevices) {
    };
  @Override
  public void onAudioDevicesRemoved(AudioDeviceInfo[] removedDevices) {
    // Handle device removal
  };
};

audioManager.registerAudioDeviceCallback(audioDeviceCallback);

Encontrar dispositivo de áudio BLE

Confira uma lista de todos os dispositivos de áudio conectados com entrada compatível e use getType() para ver se o dispositivo é um fone de ouvido usando 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;
  }
}

Suporte estéreo

Para verificar se o dispositivo selecionado é compatível com microfones estéreos, confira se o dispositivo tem dois ou mais canais. Se o dispositivo tiver apenas um canal, defina a máscara de canais como mono.

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

Configurar o gravador de áudio

Os gravadores de áudio podem ser configurados usando o builder AudioRecord padrão. Use a máscara de canais para selecionar a configuração estéreo ou mono.

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

Definir dispositivo preferido

A definição de um dispositivo preferido informa ao recorder de áudio qual dispositivo de áudio que você quer usar na gravação.

Kotlin

recorder.preferredDevice = audioDevice

Java

recorder.setPreferredDevice(bleInputDevice);

Agora você pode gravar áudio conforme descrito no guia do MediaRecorder.