我已经尝试了一个很好的时间让NsdManager发现功能在Android9上工作,在此之前,它可以在任何安卓版本上工作,没有任何问题。
为了测试目的,我使用了这个简单的代码片段,清单中有"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")
}
})当执行这段代码时,我在日志中看不到任何调试或错误消息。
使用Wireshark,我可以看到广播的mDNS标准查询"_https._tcp.local“以及所有预期设备的所有相应响应。这些回复似乎没有在安卓系统上收到,因为"onServiceFound“函数从来没有被调用过。事实上,除了"onDiscoveryStared“之外,没有任何函数被调用。
我还没有看到Android 9的任何变化,也没有看到它为什么不起作用,任何帮助都是很高兴的。也许我做错了什么,或者错过了当前Android版本的任何权限更改。
更新:在三星的S9+上,目前的Android9beta版,服务发现工作没有任何问题。在我的Pixel 3XL的另一边,它不工作。
发布于 2018-12-05 11:02:20
好的,我在一个旧的Github问题中找到了这个问题的解决方案。显然,您需要拥有wifi多播权限,并且需要获得一个MulticastLock来接收多播消息。
我还没有找到任何有关这方面的文档,这似乎不是Android 9的一个特定问题,而是Google默认设置,禁用所有监听多播包以保留电池。
对于任何想要解决这个问题并且不想深入研究长时间问题的人,我添加了以下代码:
AndroidManifest.xml:
<uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE"/>浏览器:
WifiManager wifi = (WifiManager) mContext.getSystemService(Context.WIFI_SERVICE);
WifiManager.MulticastLock multicastLock = wifi.createMulticastLock("multicastLock");
multicastLock.setReferenceCounted(true);
multicastLock.acquire();
.
.
multicastLock.release(); // release after browsinghttps://stackoverflow.com/questions/53615125
复制相似问题