Android 4.0是否支持蓝牙智能(4.0)/ GATT?

28

我正在尝试找到一种使用现代 Android 智能手机(即HTC One V)与 Bluetooth 4.0 (又称 Bluetooth Smart) 设备配对的方法。

据我了解,即使在 Android 4.0 中使用 Bluetooth 4.0 硬件,使用 GATT profile 仍存在一些 API 限制问题。

我看到 Motorola 发布了自己的 BT LE API,但不确定它是否适用于其他供应商的设备。我的目标是为所有具有适当硬件的智能手机提供通用支持。

任何解决方案的建议都将不胜感激。

Alexey

注:我看到了 Android HDP API,但似乎只能与“传统”的蓝牙设备 (而非低功耗设备,如 BT LE) 使用。


1
三星发布了一个蓝牙BLE SDK(测试版)。请参考这个问题:https://dev59.com/hGgu5IYBdhLWcg3wv5im - OneWorld
这是一份关于BLE的官方声明,来自Google员工在最新的IO大会上。https://developers.google.com/events/io/sessions/326240948 所有带有4.3和BLE硬件的设备都将拥有官方的Android BLE API,并在此视频会议中进行演示。 - OneWorld
6个回答

26

很不幸,Android目前不支持低功耗蓝牙,因此没有原生的Android GATT API可用。这可能会在未来的Android版本中发生改变,但是今天的制造商代替使用第三方蓝牙堆栈集成低功耗支持,例如来自Qualcomm、Broadcom或CSR等供应商的API。这些都带有自己的API集,显然限制了兼容性只能针对使用该特定供应商堆栈的手机。

好消息是,在其他平台上(如iOS或Windows 8),存在本地的GATT BLE API,并得到良好支持。对于Android,我们必须等待Google决定将已经完成的Linux/BlueZ BLE工作与Android集成。


1
你看过这个 Broadcom 芯片的 API 吗?http://code.google.com/p/broadcom-ble/ - friedger
2
据我所知,在Android 4.1上没有对此问题进行任何调整。 :( - AlexeyVMP
1
此外,看起来摩托罗拉在ICS更新中破坏了RAZR的BLE支持。 - AlexeyVMP
好的,我已经标记了那个问题。此外,我有信息称三星承诺很快为Galaxy系列解决这个问题。 - AlexeyVMP
1
我实际上反编译了一些从Google Play下载的应用程序,这些应用程序使用了SGSIII的BLE功能,并发现了一些在Android本地蓝牙API中不存在的方法,它们的名称明确说明了它们与BLE有关。我尝试通过Java反射使用它们,目前正在研究开发库的可能性。但是到目前为止,我运行的测试结果不太稳定。 - Moises Jimenez
显示剩余5条评论

13

经过我的一些研究,我只能说:

  • Motorola已与Broadcom联手开发专有API。看起来它非常受限,因为它表示仅支持现有的配置文件。请在此处查看详情here.

  • 三星没有提供有关其BLE API的任何信息,但我可以证实它存在并称为samsung.bluetoothle。我实际上反编译了一些使用SGSIII的BLE功能的Google Play应用程序,并找到了一些不存在于Android本机BT API中的方法,它们的名称清楚地表明它们与BLE相关。我尝试通过Java反射使用它们,并且目前正在探索开发库的可能性。但是到目前为止,我进行的测试结果最好也很不稳定。三星的开发者论坛上也有一个帖子,如果您感兴趣,建议在here施加一些压力。

  • Google在这方面几乎没有发表任何言论。 Galaxy Nexus上有一个帖子,您应该为此加星,并有很多人在抱怨。从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三星SGIII上运行正常。还有其他发现吗,rodkarom? - BBaker
下周我可能需要开发一个尽可能跨平台的BLE解决方案,用于Android。你有没有一些示例代码可以帮助我完成这个任务?网上可供参考的内容并不如我所愿。 - Mamsaac
很抱歉告诉您,无法开发跨平台解决方案。请记住,唯一的可能性是使用Motorola的API和我目前收集到的信息。 - Moises Jimenez
你会注意到,其中3次中有5次它不起作用,如果你尝试关闭蓝牙,手机就会崩溃。 - τεκ
是的,在纸条上说了(它工作了多少次,没有注意到崩溃问题)。 - Moises Jimenez

2

1

HTC自去年以来一直支持BLE功能,包括HTC One X+、Droid DNA和HTC One。最初,HTC BLE API只能通过请求获得,但现在可以在http://htcdev.com上免费下载。

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


0

据发现,4.3版本支持BLE,但在Nexus设备上存在很多问题。 我认为它还没有准备好投入生产。



网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接