如何在Android中创建不安全的RFCOMM套接字?
我正在寻找通过rfcomm套接字进行不安全连接的方法。我能够找到下面提到的方法如何在Android中创建不安全的RFCOMM套接字?,android,bluetooth,insecure-connection,Android,Bluetooth,Insecure Connection,我正在寻找通过rfcomm套接字进行不安全连接的方法。我能够找到下面提到的方法 Method m = device.getClass().getMethod("createInsecureRfcommSocket", new Class[] {int.class}); tmp = (BluetoothSocket) m.invoke(device, 1); 现在这是我想要的。就连上面的文档都说,我们需要使用CreateSecurerCommsocketToServiceRecord来处理不安全
Method m = device.getClass().getMethod("createInsecureRfcommSocket", new Class[] {int.class});
tmp = (BluetoothSocket) m.invoke(device, 1);
现在这是我想要的。就连上面的文档都说,我们需要使用CreateSecurerCommsocketToServiceRecord来处理不安全的连接。但没有这样的方法。我发现的唯一方法是如上所示使用反射。即使在这种情况下,在CreateSecurerCommSocket中传递的方法,而不是CreateSecurerCommSocketToServiceRecord。我只是想知道这种方式有多可靠。如果我在方法中提到CreateSecurerCommsocketToServiceRecord,则连接永远不会发生
CreateSecurerCommsockettoServiceRecord()
从Android API级别10开始就包含在内,因此文档鼓励您使用它,因为文档始终遵循最新版本的API。如果您的目标API低于10(也称为2.3.3或姜饼),则您无法公开访问该方法
您通过反射调用的方法createInsurerCommSocket()
是BluetoothDevice
中的一个私有方法,大约从Android 2.0开始出现。调用隐藏方法的问题在于,它们不能保证在所有设备上都存在,或者将来也不会存在……所以你有点赌博。我的猜测是,您的方法可能在大多数2.0+设备上大部分时间都有效,因为在堆栈层实现它的公共类createrFComSocketToServiceRecord()
所需的服务非常相似
一句话,如果您希望保证蓝牙实现的通用兼容性,那么您的应用程序必须以2.3.3(API级别10)为目标。现在公开了一个用于不安全RFCOMM的公共API,很难说底层私有实现是否会发生变化。在这篇文章中,这里的大多数回答都是在2011年3月30日之前回答的 在我的应用程序中寻找类似问题的解决方案时,我发现这个博客写在3月30日 它将帮助所有仍在寻找这个问题解决方案的人 现在,解决方案变得非常简单。只需在项目中包含unsecureBluetooth.java,并在BluetoothChatService.java中更改两行即可
tmp = InsecureBluetooth.listenUsingRfcommWithServiceRecord(mAdapter, NAME, MY_UUID, true);
及
就这样 非常感谢你为我指明了正确的方向。如果该API仅在API级别10之后可用,那么如果我使用Android 2.1ATM开发,如何不安全地连接到设备,您已经找到了最佳折衷方案。请记住,反射解决方案可能在更高版本中消失,因此您可能希望编写代码,使用
Build.version
检查设备上的版本,并使用2.3及更高版本的公共API。这将要求您将目标API级别增加到10,但将最低API级别保留为5(或7),以便它仍能在运行2.1或2.2的早期设备上运行。希望有帮助@无线,但它是否能与API 7中的方法createInsurerFComSocketToServiceRecord()一起工作?@Veer我不确定您的意思,因为createInsurerFComSocketToServiceRecord()不在API 7中,它是在API 10中引入的。在此之前,只能通过反射进行访问,这是不保证的。也许重新阅读答案和随后的评论。@Devunwired如果我能对你的答案投10次赞成票,我会的。刚刚弄明白为什么我不能在我的应用程序中自动配对,现在我可以了,谢谢!
tmp = InsecureBluetooth.createRfcommSocketToServiceRecord(device, MY_UUID, true);