2011-03-15 44 views
18

我正在寻找通过rfcomm套接字不安全地连接的方式。我能找到下面提到的方式如何在Android中创建不安全的RFCOMM套接字?

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

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

回答

29

createInsecureRfcommSocketToServiceRecord()被列入开始与Android API级别10,因此文档会鼓励你使用它,因为文档始终遵循最新版本的API。如果您的目标是低于10(a.k.a.2.3.3或姜饼)的API,则该方法不能公开访问。

您通过反射调用的方法是BluetoothDevice内部的私有方法,自从大致Android 2.0以来已经存在。调用隐藏方法的问题在于,它们不能保证在所有设备上或将来都存在,所以您赌博了一下。我的猜测是,你的方法可能在大多数2.0+设备上大部分时间都可以工作,因为在堆栈层实现其公共表弟createRfcommSocketToServiceRecord()所需的服务非常相似。底线,如果你想保证与你的蓝牙实现的通用兼容性,你将不得不针对你的应用程序定位2.3.3(API等级10)。由于公开的API现在暴露在不安全的RFCOMM中,很难说底层私有实现或多或少可能改变。

+0

非常感谢我指向正确的方向。如果该API仅在API级别10后才可用,那么如果我正在使用Android 2.1 – sunil 2011-03-16 07:07:18

+3

ATM进行开发,那么如何不安全地连接到设备,您已找到最佳折中方案。请记住,反射解决方案可能会在更高版本中消失,因此您可能希望编写代码以使用“Build.VERSION”检查设备上的版本,并使用2.3和更高版本的公共API。这将要求您将目标API级别提高到10,但将最低API级别保留为5(或7),以便它仍然可以在运行2.1或2.2的早期设备上运行。希望有所帮助! – Devunwired 2011-03-16 13:52:37

+0

@Wireless,但它可以在API 7中使用createInsecureRfcommSocketToServiceRecord()方法吗? – 2011-07-27 07:43:59

0
+0

@丹尼斯马修斯先生,我需要你看看这个链接 – 2011-08-08 05:15:31

+0

http://stackoverflow.com/questions/6872451/android-bluetooth-connection-issue – 2011-08-08 05:15:41

5

大部分答复的答案都在2011年3月30日之前的这篇文章中。

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

这将帮助所有那些谁仍然在寻找这个问题的解决方案上SO

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

完蛋了!

+4

链接是404 – Rafay 2014-07-04 05:25:52