如何在Android中实例化L2Cap套接字?

时间:2018-07-31 13:36:50

标签: android bluetooth bluetooth-lowenergy l2cap

我看到Bluetooth socket的类型可以为TYPE_L2CAP,但是BluetoothSocket的构造函数似乎是私有的,我只能找到一种实例化RFCOMM类型的套接字的方法。 如何获得和使用L2CAP插座? Android确实支持吗?

1 个答案:

答案 0 :(得分:2)

更新03/2019 随着第一个Android Q beta的发布,看来支持终于来了。 https://developer.android.com/sdk/api_diff/q-beta1/changes.html

更新10/2018

从Android Q开始获得支持L2CAP CoC的信息。

不幸的是,我无法为此提供官方消息。

旧答案

我将发布自己的结果,希望能帮助他人,并在我遗漏某些东西时获得提示。

TL; DR :看来我做不到

无法通过公共API获取L2CAP CoC套接字

Android文档中的

This页声称,从Android 8.0开始,“面向LE连接的通道”(l2cap通道)可用。 在Android API中,有一个BluetoothSocket类,其类型可以为L2_CAP。但是由于该类元素的私有可见性,因此无法获得具有此类类型的BluetoothSocket实例。对于公共 Android java API:固定。

是吗?

在公共Java API的表面下进行挖掘。 android 8+版本的源代码提供了一种获取随时间变化的l2cap套接字的方法:

  • android 8(source)中的createL2capSocket方法
  • android 9(source)中的createL2capCoCSocket方法
  • android项目的master分支中的createL2capChannel(我猜是未来版本吗?)(source

但是在每个发行的版本中,该代码都带有@hide注释,这意味着这些方法实际上都不可用。

在某些设备上,至少可以使用Java反射访问Android 9隐藏方法。这就是我们能够在android 8上进行测试的结果。

自操作系统版本9起,就不再可能:平台actively blocks attempts无法正确访问API。

此外。

除了实例化套接字的方法不可见之外,还有API不成熟的证据,也缺少用于调整l2cap连接参数的方法。

要本地化吗?

我没有使用NDK的经验,但是我认为可以编写C代码来利用隐藏方法所使用的相同的低级函数。除非android也没有阻止这种用法,否则很有可能。 同样,这种用法将与手机上蓝牙堆栈的常规用法冲突:常规用法通常全部由Android服务过滤。绕过此服务将导致不可预期的后果,并且不适合生产高效的应用程序。

总结

在Android 8.1上使用反射进行测试导致非常不满意的结果。尽管付出了很多努力,但仍无法确认自Android 8.0起就提供了“面向LE连接的通道”。

在较新的版本中,用于创建l2cap通道的隐藏方法正在发展,最近,hide注释为removed。在时间上很难说出这意味着什么,我们才可以拥有支持该API的设备。 l2cap频道要可靠并可供大部分Android用户使用,可能需要花费数年的时间。