Я уже давно пытался заставить функцию обнаружения NsdManager работать на Android 9. До этого она работала на любой версии Android без проблем.
В целях тестирования я использую этот простой кодфрагмент и есть разрешение для «ИНТЕРНЕТ» в манифесте.
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 Iможно просмотреть транслируемый стандартный запрос mDNS для «_https._tcp.local» и все соответствующие ответы от всех ожидаемых устройств.Похоже, что ответы на Android не принимаются, потому что функция onServiceFound никогда не вызывается.На самом деле никакая функция, кроме «onDiscoveryStared», никогда не вызывается.
Я не видел каких-либо изменений в Android 9, почему это не должно работать, и любая помощь с удовольствием приветствуется.Возможно, я сделал что-то не так или пропустил изменения прав доступа в текущей версии Android.
ОБНОВЛЕНИЕ: На Samsung S9 + с текущей бета-версией Android 9 обнаружение службы работает без каких-либо проблем.На моем Pixel 3XL с другой стороны не работает.