Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/222.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Android中创建不安全的RFCOMM套接字?_Android_Bluetooth_Insecure Connection - Fatal编程技术网

如何在Android中创建不安全的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来处理不安全

我正在寻找通过rfcomm套接字进行不安全连接的方法。我能够找到下面提到的方法

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);