我现在已经尝试让 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,我可以看到“_https._tcp.local”的广播 mDNS 标准查询以及来自所有预期设备的所有相应响应。在 Android 上似乎没有收到响应,因为从未调用过函数“onServiceFound”。事实上,除了“onDiscoveryStared”之外,没有任何函数被调用过。
我在 Android 9 上没有看到任何关于为什么这不应该工作的变化,并且很高兴提供任何帮助。也许我做错了什么或错过了当前 Android 版本中的任何权限更改。
更新:在带有当前 Android 9 测试版的三星 S9+ 上,服务发现可以正常工作。在另一边的我的 Pixel 3XL 上它不起作用。