我正在寻找不安全地连接rfcomm socket的方法。我能够找到下面提到的方式
Method m = device.getClass().getMethod("createInsecureRfcommSocket", new Class[] {int.class});
tmp = (BluetoothSocket) m.invoke(device, 1);
这暂时正在做我想做的事。即使是here上的文档也说我们需要使用createInsecureRfcommSocketToServiceRecord进行不安全的连接。但是没有这样的方法。我发现的唯一方法是使用如上所示的反射。甚至在createInsecureRfcommSocket中传递的方法,而不是createInsecureRfcommSocketToServiceRecord。我只是想知道这种方式有多可靠。如果我在方法中提到createInsecureRfcommSocketToServiceRecord,则连接永远不会发生。
答案 0 :(得分:29)
createInsecureRfcommSocketToServiceRecord()
,因此文档会鼓励您使用它,因为文档始终遵循最新版本的API。如果您的目标API低于10(a.k.a。2.3.3或Gingerbread),那么您无法公开访问该方法。
您通过反射createInsecureRfcommSocket()
调用的方法是BluetoothDevice
内部的私有方法,自大约Android 2.0以来一直存在。调用隐藏方法的问题在于它们不能保证在所有设备上或将来存在......所以你赌博了一下。我的猜测是你的方法大部分时间都可能在大多数2.0以上的设备上运行,因为实现其公共表兄createRfcommSocketToServiceRecord()
所需的服务在堆栈层非常相似。
最重要的是,如果您希望保证与蓝牙实施的通用兼容性,则必须将2.3.3(API级别10)与您的应用程序对准。现在公开的API暴露在不安全的RFCOMM中,很难说底层私有实现是否更有可能发生变化。
答案 1 :(得分: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);
多数民众赞成!
答案 2 :(得分:0)