我已经尝试了很长时间,让 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")
}
})
当此代码执行时,我在日志中看不到任何调试或错误消息。
使用 Wireshark,我可以看到广播的 mDNS 标准查询“_https._tcp.local”以及来自所有预期设备的所有相应响应。 Android 上似乎没有收到响应,因为函数“onServiceFound”从未被调用。事实上,除了“onDiscoveryStared”之外,没有任何函数被调用。
我还没有看到 Android 9 上有任何关于为什么这不应该工作的变化,我们很高兴提供任何帮助。也许我做错了什么或者错过了当前 Android 版本中的任何权限更改。
更新:在运行当前 Android 9 beta 的三星 S9+ 上,服务发现工作没有任何问题。在我的另一侧 Pixel 3XL 上,它不起作用。
好的,我在旧的版本中找到了解决这个问题的方法Github问题。显然你需要有wifi多播权限并且需要获取组播锁接收多播消息。
我还没有找到任何有关此问题的文档,这似乎不是 Android 9 的特定问题,而是 Google Pixel 默认设置,用于禁用对多播包的所有侦听以节省电池。
对于遇到此问题并且不想深入研究长期问题的任何人,我添加了以下代码:
AndroidManifest.xml:
<uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE"/>
Browser:
WifiManager wifi = (WifiManager) mContext.getSystemService(Context.WIFI_SERVICE);
WifiManager.MulticastLock multicastLock = wifi.createMulticastLock("multicastLock");
multicastLock.setReferenceCounted(true);
multicastLock.acquire();
.
.
multicastLock.release(); // release after browsing
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)