NsdManager发现在Android 9上不起作用

paz*_*azi 1 android mdns bonjour nsdmanager android-9.0-pie

我已经尝试了很长时间,让NsdManager发现功能在Android 9上运行。它可以在此之前的任何Android版本上正常运行。

为了进行测试,我使用了这个简单的代码段,清单中有“ INTERNET”的权限。

var nsdManager = context.getSystemService(Context.NSD_SERVICE) as NsdManager

nsdManager.discoverServices("_https._tcp", NsdManager.PROTOCOL_DNS_SD, object: NsdManager.DiscoveryListener {
    override fun onDiscoveryStarted(serviceType: String?) {
        println("DEBUG: onDiscoveryStarted $serviceType") 
    }
    override fun onDiscoveryStopped(serviceType: String?) {
        println("DEBUG: onDiscoveryStopped $serviceType") 
    }
    override fun onServiceFound(serviceInfo: NsdServiceInfo?) {
        println("DEBUG: onServiceFound $serviceInfo") 
    }
    override fun onServiceLost(serviceInfo: NsdServiceInfo?) {
        println("DEBUG: onServiceLost $serviceInfo") 
    }
    override fun onStartDiscoveryFailed(serviceType: String?, errorCode: Int) {
        println("DEBUG: onStartDiscoveryFailed $serviceType $errorCode") 
    }
    override fun onStopDiscoveryFailed(serviceType: String?, errorCode: Int) {
        println("DEBUG: onStopDiscoveryFailed $serviceType $errorCode") 
    }
})
Run Code Online (Sandbox Code Playgroud)

当执行此代码时,我在日志中看不到任何调试或错误消息。

使用Wireshark,我可以看到广播的mDNS Standard查询“ _https._tcp.local”以及来自所有预期设备的所有相应响应。由于从未调用过函数“ onServiceFound”,因此似乎在Android上似乎未收到响应。实际上,除“ onDiscoveryStared”外,没有函数被调用过。

我尚未在Android 9上看到任何关于为什么不起作用的更改,我们非常感谢您的帮助。也许我做错了什么,或者错过了当前Android版本中的任何权限更改。

更新:在具有当前Android 9 beta的Samsung S9 +上,服务发现可以正常工作。另一方面,在我的Pixel 3XL上它不起作用。

paz*_*azi 5

好的,我已经在一个旧的Github问题中找到了解决该问题的方法 。显然,您需要具有wifi多播许可,并且需要获取MulticastLock才能接收多播消息。

我尚未找到有关此文档的任何文档,它似乎不是Android 9的特定问题,而是Google Pixel默认设置,该设置可禁用所有对多播包的监听以节省电池电量。

对于遇到此问题且不想深入探讨长期问题的任何人,我添加了以下代码:

AndroidManifest.xml:

<uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE"/>
Run Code Online (Sandbox Code Playgroud)

浏览器:

WifiManager wifi = (WifiManager) mContext.getSystemService(Context.WIFI_SERVICE);
WifiManager.MulticastLock multicastLock = wifi.createMulticastLock("multicastLock");
multicastLock.setReferenceCounted(true);
multicastLock.acquire();
.
.
multicastLock.release(); // release after browsing
Run Code Online (Sandbox Code Playgroud)

  • 遇到同样的问题,按照这个答案直接解决。 (2认同)
  • 可以确认这个答案解决了 Pixel-3a Android 10 上的问题。相同的代码适用于运行 Android 10 的非 Pixel-3a 设备,因此它似乎特定于 Pixel 系列。 (2认同)
  • 我在 Android 12 上遇到了同样的问题。该发现在所有旧版本中都能正常工作,但现在在 Android 12 上不起作用。我尝试了这个解决方案,但它不起作用,只调用了 onDiscoveryStared 。没有崩溃,没有错误 (2认同)