代码中已经使用了获取multicastLock的方法来接收组播消息,大部分服务都可以找到,但是有少数相同服务类型的服务在Android 14上找不到(在Android 13上可以找到)或者Android 12使用相同的代码和相同的Android手机),我不知道是否是因为Android 14上的NsdManager发生了变化,或者Android 14上存在一些错误。有解决这个问题的线索吗? 我用来发现服务的方式是:
nsdManager.discoverServices("myOwnServiceType._tcp", NsdManager.PROTOCOL_DNS_SD, nsdListener)
而获取和释放MulticastLock的方式是:
fun acquireMulticastLock() {
if (multicastLock == null) {
synchronized(this) {
if (multicastLock == null) {
val wifiManager = context.getSystemService(Context.WIFI_SERVICE) as WifiManager
multicastLock = wifiManager.createMulticastLock("multicastLock")
multicastLock?.setReferenceCounted(true)
}
}
}
multicastLock?.acquire()
}
fun releaseMulticastLock() {
multicastLock?.release()
multicastLock = null
}
曾经添加MulticastLock以使Google Pixel手机能够接收多播消息,因为Google Pixel手机的默认设置是禁用所有多播包的监听以节省电池。因此,此时Bonjour服务需要获取MulticastLock来接收组播消息。 但我在 Android 14 上进行了测试,删除此multicastLock 或将其添加回来似乎没有任何区别。
这些都是我迄今为止的所有尝试。
在尝试
RxDNSSD
和JmDNS
并找出NsdManger内的根本原因后,JmDNS
解决了我的问题。
目前,我使用版本implementation 'org.jmdns:jmdns:3.5.9'
,它在Android 14上运行良好,我在几部具有OS 14的Android手机上测试了它,它可以发现使用NsdManger在Android 14上无法发现的服务。
使用的关键是
JmDNS
是
object : ServiceListener
JmDNS.create()
jmdns.addServiceListener("${YourServiceType}.local.", jmdnsListener)
开始浏览和侦听服务jmdns.close()