18

我正在研究不安全地通过 rfcomm 套接字连接的方式。我能够找到下面提到的方式

Method m = device.getClass().getMethod("createInsecureRfcommSocket", new Class[] {int.class});
tmp = (BluetoothSocket) m.invoke(device, 1);

这暂时是做我想做的事。甚至这里的文档也说我们需要使用 createInsecureRfcommSocketToServiceRecord 来进行不安全的连接。但是没有这样的方法。我发现的唯一方法是使用反射,如上所示。甚至在 createInsecureRfcommSocket 而不是 createInsecureRfcommSocketToServiceRecord 中传递的方法。我只是想知道这种方式有多可靠。如果我在方法中提到 createInsecureRfcommSocketToServiceRecord,则连接永远不会发生。

4

2 回答 2

29

createInsecureRfcommSocketToServiceRecord()从 Android API 级别 10 开始包含在内,因此文档将鼓励您使用它,因为文档始终遵循 API 的最新版本。如果您的目标 API 低于 10(又名 2.3.3 或 Gingerbread),那么您无法公开访问该方法。

您通过反射调用的方法createInsecureRfcommSocket()是内部的私有方法BluetoothDevice,大约从 Android 2.0 开始就存在。调用隐藏方法的问题在于它们不能保证在所有设备上都存在,或者在未来......所以你有点赌博。我的猜测是您的方法可能大部分时间都适用于大多数 2.0+ 设备,因为实现其公共表亲所需的服务createRfcommSocketToServiceRecord()在堆栈层非常相似。

最重要的是,如果您想要保证与您的蓝牙实现的通用兼容性,您的应用程序必须以 2.3.3(API 级别 10)为目标。由于现在为不安全的 RFCOMM 公开了一个公共 API,很难说底层私有实现是否有可能发生变化。

于 2011-03-15T23:04:05.090 回答
5

好吧,这里的大多数回复答案都在 2011 年 3 月 30 日之前,在这篇文章中。

在我的应用程序中寻找类似问题的解决方案时,我发现这篇博客写于 3 月 30 日。

它将帮助所有仍在寻找此问题解决方案的人

http://mobisocial.stanford.edu/news/2011/03/bluetooth-reflection-and-legacy-nfc/

解决方案现在变得非常简单。只需在您的项目中包含 InsecureBluetooth.java 并在 BluetoothChatService.java 中更改 2 行。

tmp = InsecureBluetooth.listenUsingRfcommWithServiceRecord(mAdapter, NAME, MY_UUID, true);

tmp   = InsecureBluetooth.createRfcommSocketToServiceRecord(device, MY_UUID, true);

而已 !

于 2011-12-28T07:49:44.300 回答