如何在Android中创建不安全的RFCOMM套接字?

sun*_*nil 18 android bluetooth insecure-connection

我正在寻找不安全地连接rfcomm socket的方法.我能够找到下面提到的方法

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

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

Dev*_*red 29

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

您通过反射调用的方法createInsecureRfcommSocket()是一种私有方法BluetoothDevice,自大约Android 2.0以来一直存在.调用隐藏方法的问题在于它们不能保证在所有设备上或将来存在......所以你赌博了一下.我的猜测是你的方法大部分时间都可能在大多数2.0以上的设备上工作,因为实现其公共表亲所需的服务createRfcommSocketToServiceRecord()在堆栈层非常相似.

最重要的是,如果您希望保证与蓝牙实现的通用兼容性,则必须将2.3.3(API级别10)与您的应用程序对准.由于公开的API现在暴露在不安全的RFCOMM中,很难说底层私有实现是否更有可能发生变化.

  • ATM,你找到了最好的妥协.请记住,反射解决方案可能会在以后的版本中消失,因此您可能需要编写代码以使用`Build.VERSION`检查设备上的版本,并使用2.3及更高版本的公共API.这将要求您将目标API级别提高到10,但将最低API级别保留为5(或7),以便它仍然可以在运行2.1或2.2的早期设备上运行.希望有所帮助! (3认同)

Sou*_*rma 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);
Run Code Online (Sandbox Code Playgroud)

tmp   = InsecureBluetooth.createRfcommSocketToServiceRecord(device, MY_UUID, true);
Run Code Online (Sandbox Code Playgroud)

而已 !

  • 链接是404 (5认同)