先提问...
1) Android (pre API23) 如何检测蓝牙设备的设备类型?显然,在我尝试连接的双模蓝牙耳机中设置 BLE ADV 标志BREDR_NOT_SUPPORTED可以解决问题,但代价是干扰了更现代 API 中的经典链接设置/配对。所以这不是一个真正的选择......
2)如果在我的蓝牙耳机中什么都不能做 FW-wise (这将是最好的),你能否提出任何想法,我可以如何覆盖 BluetoothAdapter 的设备检测逻辑,以便我总是返回设备类型DUAL。我的意思是,我不需要在应用程序中进行适当的检测,因为我已经在 LE 扫描期间使用 GATT 服务 UUID 过滤来首先找到设备,所以我已经知道它是一个“兼容设备”,只要我能让 Android 在 API23 之前的手机上做出相应的行为......
...然后也许是一些背景/上下文;)
我正在为 iOS 和 Android 制作与蓝牙耳机交互的应用程序,我也为其编写固件。因此,我对耳机和应用程序的行为都有源代码控制。
该耳机基于高通的 CSR8670 芯片组,充当双模蓝牙“智能就绪”规范 4.2 小工具,典型的经典配置文件 (A2DP/AVRCP/HFP) 加上我自己的自定义 GATT 服务作为运行 BLE 外围设备隧道专有串行协议以在电话端连接我的应用程序。
一切都像 iOS 上的魅力一样。
但...
在 Android 上,自从 API23 和 Marshmallow 作为 BLE ADV 数据推出以来,我已经看到了一个逐渐的变化,特别是 ADV 标志已经开始被 Android 用来控制经典的蓝牙链接建立/配对。
例如,几年前,当API21是最新的东西时,我必须明确设置 BREDR_NOT_SUPPORTED标志并使用反射来强制传输 = BLE 以最终成功完成我的connectGatt(..)
请求。
但是,由于API23不需要,因为耳机是支持 BREDR 的双模设备,所以没有任何意义。
相反,建议使用LE_BR_EDR_CONTROLLER和LE_BR_EDR_HOST BLE ADV 标志让 Android 知道这确实是一个功能齐全的双模设备......
它有效。正好。只要您不再尝试在 Android API21 手机上运行您的配套应用程序,现在突然无法检测到我的耳机是双模设备。尽管我采用反射方法强制正确连接和正确传输,但在我的三星 S5“活动”测试手机上运行 API21 的 Android 根本不会与我的耳机建立 GATT 连接,我强烈认为这与设备类型为检测为DEVICE_TYPE_CLASSIC
。