我正在开发一款录音机应用,它使用蓝牙麦克风将音频录制到Android设备上(Nexus 7 - 扎根Android 4.4.2)。它目前在HFP上实施,一切正常。蓝牙麦克风是用Bluegiga的WT32蓝牙模块+麦克风输入实现的,通过HFP的音质不是很好,但现在已足够了。
然而,我现在正试图将蓝牙配置文件更改为A2dp,因为有两个麦克风输入(L / R),而WT32支持A2dp(源)。经过大量研究后,我发现Android不支持A2dp(接收器),并且可以修改Android的蓝牙堆栈以启用A2dp(接收器)。
我不明白的是如何访问和修改蓝牙堆栈。如果有答案的人能够分解实现此目的的步骤,那就太好了。
我尝试过这个问题的答案: Receive audio via Bluetooth in Android,但我似乎无法找到要修改的相应文件。实际上,我甚至不知道我是否正在查找正确的文件夹。我通过Android-studio的DDMS-File Explorer查看了设备文件。
ps,我在Android应用程序开发方面仍然相当新,所以我可能误用了一些术语,并为此提前道歉。答案 0 :(得分:15)
所以上面的答案并不完全正确。
以下是它如何分解:
HAL,是用c / cpp代码实现实际蓝牙状态机的硬件抽象层,因此它控制A2dp,HFP,GATT,SPP,AVRCP等服务的各种状态机。这些服务中的每一个还引用SMP和ATT文件来控制实际的蓝牙服务器或客户端数据库,并且具有安全性。
HCI,是实际工作的地方。 HAL并不真正做任何事情,它将通过tty串行(spi或UART)发送的复杂数据消息组装到PCBA上的网络间连接芯片上。 HCI层中使用的方法,可以在" BTE"层/ in / external / bluetooth / bluedroid /从AOSP 4.2.2到当前的android编译中继的目录。 - 目前有几家这些芯片的制造商,但他们大多数都是基于Broadcom的ic,采用双无线或三无线电封装,包含wifi,蓝牙4.0智能和蓝牙4.0无线电。
可以执行您要执行的操作,但您需要将hardware.so和bluetooth_jni.so包含到与您的应用程序一起使用的NDK / JNI程序包/项目中,并通过来自在" Packages / apps / Bluetooth / jni"中找到的每个蓝牙服务的.cpp文件,然后您将在NDK库中处理注册&com; com_android_bluetooth_a2dp.cpp'和& #39; com_android_bluetooth_avrcp.cpp',作为其适当类型的对象。
另一个问题是,您需要实现自己的自定义A2DP堆栈,因为Android Bluedroid堆栈只有位于 Sink 角色中的位和部分。框架,而A2DP角色完全实现 Source 角色。此外,根据您实际打算如何处理蓝牙A2DP接收器实现,您还需要实施AVRCP - 根据蓝牙SIG(特殊兴趣小组),蓝牙设备之间存在互连要求,这将导致重大问题如果你实现了sink角色,没有AVRCP"远程控制目标设备"和#34;远程控制控制设备",作为接收角色,来自蓝牙的A2DP(或任何蓝牙服务/配置文件)的ATT命令在服务发现过程中,当关联的网关(连接设备)时,执行某些握手,执行功能请求期望A2DP服务实现Start Stop命令的i / o功能,并可能跳过/跟踪advance命令。
除此之外,在实施A2DP时,您需要选择是否要处理PCM流或AAC流。如果您正在处理AAC流(或DRM保护的PCM流,就像Pandora,spotify等所使用的那样),您需要实现适合您实现的SBC编码器或解码器,否则您将拥有的只是一堆加密数据。此外,确保以适当的速度为您的设备实现比特率AudioManager实现,一些手机使用48,000hZ,一些我们使用44,100hZ,如果您想要高质量音频,这一点很重要,因为通常大多数PCM A2DP实施都使用环绕声7.1 +将需要48,000hZ以及AAC编码/解码。
我希望这会为您提供一些见解。
答案 1 :(得分:13)
https://android-review.googlesource.com/#/c/98161/实施A2DP接收器。它适用于Nexus 5.你可以试试。
答案 2 :(得分:7)
这实际上是我想要做的很长一段时间...... 您无法找到配置文件的原因是因为Google用Blue和Google构建的新堆栈替换了BlueZ的蓝牙堆栈。新堆栈使用不同的配置文件,我不知道如何修补。
如果你认真对待它,我发现最接近的是Android上蓝牙框架的官方介绍: https://source.android.com/devices/bluetooth.html
答案 3 :(得分:2)
随着时间的流逝,Android操作系统发生了很多变化。
从Android O(Android 8. *)开始,接收器配置文件受Google部分支持。如果在配置文件中启用,音频接收器等将很容易工作。看来BT的较高层是在框架上完成的某种实现,采用App即packages/app/Bluetooth
的形式(有一些错误,但仍然有效)。但是,并非所有的配置文件都通过HAL接口在框架下层完成,HAL接口是btif框架(例如btif_rc.cpp
等,您可以在Android源码中找到),并且是Google替代旧的Bluez堆栈的。
正如我所说,英国电信接收器已经部分实施,并且处于工作状态。如果将BT接收器(例如音频)启用为接收器配置文件,则将轻松工作,但并非所有(例如AVRCP)都将无法工作。目前,我看到了AOSP代码的问题,即从远程设备到Android的传入流量有效,但是从Android到远程设备的传出流量不起作用(AVRCP配置文件起作用),因为堆栈中未维护远程设备对象因此来自app / Bluetooth的JNI调用失败,并且btif_*.cpp
文件中的设备为空。例如,发送传递命令无效。
因此,我们将来可能会看到蓝牙接收器配置文件。
如果您想探索更多检查AOSP,
packages/app/Bluetooth/
处的服务system/bt/btif/