NsdManager discovery не работает на Android 9 - PullRequest
0 голосов
/ 04 декабря 2018

Я уже давно пытался заставить функцию обнаружения 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 с другой стороны не работает.

1 Ответ

0 голосов
/ 05 декабря 2018

Хорошо. Я нашел решение этой проблемы в старой проблеме Github .По-видимому, вам необходимо иметь разрешение на многоадресную рассылку Wi-Fi и приобрести MulticastLock для получения многоадресных сообщений.

Мне еще не удалось найти какую-либо документацию по этому вопросу, и, похоже, это не является конкретной проблемой.с Android 9, а скорее с настройкой Google Pixel по умолчанию, чтобы отключить все прослушивание многоадресных пакетов для сохранения заряда батареи.

Для тех, кто сталкивается с этой проблемой и не хочет погружаться в долгие проблемы, я добавил следующий код:

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 browsing
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...