تسمح الملفات الشخصية للصوت بالبلوتوث المستندة إلى "صوت Bluetooth Low Energy (BLE)" ببث الصوت العالي الجودة ثنائي الاتجاه (على سبيل المثال، صوت الاستيريو مع معدّل عيّنة يبلغ 32 كيلوهرتز). واستطعنا فعل ذلك بفضل إنشاء قناة LE Isochronous Channel. ويشبه ISO الرابط المتزامن الموجه للاتصال (SCO) لأنه يستخدم أيضًا معدل نقل بيانات لاسلكيًا محجوزًا، ولكن لم يعد حجز معدل نقل البيانات مقيدًا بـ 64 كيلوبت في الثانية ويمكن تعديله ديناميكيًا.
يمكن لميزة "إدخال الصوت عبر البلوتوث" استخدام أحدث واجهة برمجة تطبيقات AudioManager لجميع حالات الاستخدام تقريبًا، باستثناء المكالمات الهاتفية. يتناول هذا الدليل كيفية تسجيل صوت استيريو من أجهزة BLE Audio القابلة للاستماع إليها.
ضبط التطبيق
أولاً، يجب إعداد تطبيقك لاستهداف حزمة تطوير البرامج (SDK) الصحيحة في build.gradle
:
targetSdkVersion 31
تسجيل معاودة الاتصال الصوتية
أنشئ 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.