我看到Bluetooth socket的类型可以为TYPE_L2CAP,但是BluetoothSocket的构造函数似乎是私有的,我只能找到一种实例化RFCOMM类型的套接字的方法。 如何获得和使用L2CAP插座? Android确实支持吗?
答案 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套接字的方法:
createL2capSocket
方法createL2capCoCSocket
方法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用户使用,可能需要花费数年的时间。