在 Android 13 中可发现的 Bonjour 服务在 Android 14 中无法使用与 NsdManger 相同的代码发现

问题描述 投票:0回答:1

代码中已经使用了获取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 或将其添加回来似乎没有任何区别。

这些都是我迄今为止的所有尝试。

android bonjour nsd android-14 nsdmanager
1个回答
0
投票

在尝试

RxDNSSD
JmDNS
并找出NsdManger内的根本原因后,
JmDNS
解决了我的问题。 目前,我使用版本
implementation 'org.jmdns:jmdns:3.5.9'
,它在Android 14上运行良好,我在几部具有OS 14的Android手机上测试了它,它可以发现使用NsdManger在Android 14上无法发现的服务。

使用的关键是

JmDNS

  1. 实施
    object : ServiceListener
  2. 使用
    JmDNS.create()
  3. 在后台线程上创建 JmDNS 实例
  4. 使用
    jmdns.addServiceListener("${YourServiceType}.local.", jmdnsListener)
    开始浏览和侦听服务
  5. 记得使用
    jmdns.close()
  6. 关闭 jmdns
  7. 此时也需要获取MulticastLock
© www.soinside.com 2019 - 2024. All rights reserved.