Android 4.0 中的蓝牙智能 (4.0) / GATT 支持?

Posted

技术标签:

【中文标题】Android 4.0 中的蓝牙智能 (4.0) / GATT 支持?【英文标题】:Bluetooth Smart (4.0) / GATT support in Android 4.0? 【发布时间】:2012-04-06 09:08:09 【问题描述】:

我正在尝试寻找使用现代 android 智能手机的蓝牙 4.0(又名蓝牙智能)设备的方法,即 - HTC One V。

据我了解,由于 API 限制,即使在带有蓝牙 4.0 硬件的 Android 4.0 中使用 GATT 配置文件也存在一些问题。

我看到摩托罗拉发布了它自己的 BT LE API,但不确定它是否适用于其他供应商。 我的目标是为所有配备适当硬件的智能手机获得普遍支持。

非常感谢任何解决方案的建议。

阿列克谢

PS:是的,我看到了用于 HDP 的 Android API,但它似乎只用于“经典”蓝牙设备(不是低能耗设备,如 BT LE)。

【问题讨论】:

三星发布了Bluetooth BLE SDK (beta)。看到这个问题***.com/questions/11104708/… 这是 Google 员工在最新的 IO developers.google.com/events/io/sessions/326240948 上发布的关于 BLE 的官方声明所有具有 4.3 和 BLE 硬件的设备都将具有官方的 Android BLE API,这在本视频会议中进行了演示。跨度> 【参考方案1】:

很遗憾,没有 Android 原生 GATT API,因为 Android 目前根本不支持低功耗蓝牙。这可能会在即将发布的 Android 版本中发生变化,但如今制造商将第 3 方蓝牙堆栈与高通、博通或 CSR 等供应商的低功耗支持集成在一起。它们带有自己的 API 集,显然限制了对使用该特定供应商堆栈的手机集的兼容性。 好消息是,在 ios 或 Windows 8 等其他平台上,有本地 GATT BLE API,并且得到了很好的支持。对于 Android,我们将不得不等到 Google 决定将在 BLE 上完成的 Linux/BlueZ 工作与 Android 集成。

【讨论】:

谢谢。您能否提供为其平台提出定制 BT LE Android SDK 的供应商? (摩托罗拉除外) 你检查过这个用于 Broadcom 芯片的 API 吗?code.google.com/p/broadcom-ble 据我了解,在 Android 4.1 中没有在这个问题上采取任何行动 :( 此外,摩托罗拉似乎通过 ICS 更新打破了对 RAZR 的 BLE 支持。 我实际上从 Google Play 反编译了一些使用 SGSIII 的 BLE 功能的应用程序,并发现了一些在 Android 的原生 BT API 中不存在的方法,它们的名称清楚地表明它们与 BLE 相关.我已经尝试通过 java 反射使用它们,目前正在研究开发库的可能性。但到目前为止我进行的测试结果不稳定。【参考方案2】:

经过一番研究,我只能这样说:

摩托罗拉支持 Broadcom 开发专有 API。它似乎非常有限,因为它声明仅支持现有配置文件。看看here。

Samsung 未能提供任何有关其 BLE API 的信息,我可以验证其存在并被称为 samsung.bluetoothle。实际上,我从 Google Play 反编译了一些使用 SGSIII 的 BLE 功能的应用程序,并发现了一些在 Android 的原生 BT API 中不存在的方法,它们的名称清楚地表明它们与 BLE 相关。我已经尝试通过 java 反射使用它们,目前正在研究开发库的可能性。但到目前为止,我进行的测试充其量只能得到不稳定的结果。三星的开发者论坛上也有一个帖子,如果你有兴趣,我建议给here一些压力。

谷歌在这方面几乎没有发表任何评论。在 Galaxy Nexus 中有一个关于这个问题的thread,你应该给它加注星标,很多人都在抱怨。可以找到最接近 Google 答案的内容here。

[更新]

三星还修改了几个 Android 的类,更具体地说:

BluetoothAdapter BluetoothDevice

[更新]

由于缺乏 Google 和三星的支持,我已经将这个问题搁置了一段时间,所以我将发布到目前为止我所学到的知识:

BluetoothAdapter新方法:

public boolean android.bluetooth.BluetoothAdapter.leTestEnd()
public boolean android.bluetooth.BluetoothAdapter.setAvStreaming(boolean)
public boolean android.bluetooth.BluetoothAdapter.setScanLE(boolean)
public void android.bluetooth.BluetoothAdapter.setScoPathChange(int)
public boolean android.bluetooth.BluetoothAdapter.startLeDiscovery()

要使用它们,请执行以下操作:

BluetoothAdapter ba = new BluetoothAdapter();
Method starteLeDiscoveryMethod = null;
starteLeDiscoveryMethod = ba.class.getMethod("startLeDiscovery");
starteLeDiscoveryMethod.invoke(ba);

注意:这种方法的工作原理特别像常规的startDiscovery() 方法,但至少对我而言,它在 5 次中发现了 2 次 BLE 设备。 记住,这仅适用于 SGSIII。我还没有抽出BluetoothDevice 中的新方法,但是当我这样做时,我会在这里发布它们。

【讨论】:

我可以确认此代码适用于 Android 4.1.1 Samsung SGIII。任何进一步的发现rodkarom? 我可能不得不在下周为 Android 上的 BLE 开发一个“尽可能跨平台”的解决方案。您是否有一些示例代码可以帮助我完成任务?网上没有我希望的那么多。 很抱歉,请告知您无法开发跨平台解决方案。请记住,唯一的可能性是 Mototola 的 API 以及我目前收集到的内容。 您会注意到,如果您尝试关闭蓝牙,手机会崩溃,5 次中有 3 次都不起作用。 是的,在笔记上这么说(它工作了多少次,没有注意到崩溃问题)。【参考方案3】:

SDK 18 现在支持它。文档在这里:

http://developer.android.com/guide/topics/connectivity/bluetooth-le.html

在我的 Nexus 4 上进行测试导致蓝牙堆栈崩溃。

【讨论】:

【参考方案4】:

自去年以来,HTC 已经通过 HTC One X+、Droid DNA,当然还有 HTC One 获得了 BLE 支持。最初,HTC BLE API 是应要求提供的,但现在可以在http://htcdev.com 免费下载。

是的,来自 Google 的 Android API 级别 18 的新标准 Android BLE API 即将推出(参见 IO 视频预览) - 但您可以以兼容的方式封装第三方 API(HTC、三星等)以支持新标准 API,因为所有 API 在支持 GATT 配置文件方面都非常相似(类似于 IOS)。

【讨论】:

【参考方案5】:

Andorid 中可用的BluetoothGatt api

https://developer.android.com/reference/android/bluetooth/BluetoothGatt.html

【讨论】:

【参考方案6】:

据发现,4.3 支持 BLE,但它非常糟糕,尤其是在 Nexus 设备上。 在我看来,它还没有准备好投入生产。

【讨论】:

以上是关于Android 4.0 中的蓝牙智能 (4.0) / GATT 支持?的主要内容,如果未能解决你的问题,请参考以下文章

蓝牙 4.0 真的会减少智能手机的电池消耗吗?

蓝牙 4.0+ BLE 吗?

Android低功耗蓝牙(蓝牙4.0)——BLE开发(上)

Android项目实战(三十四):蓝牙4.0 BLE 多设备连接

android 蓝牙4.0 开发介绍

蓝牙4.0