3

我现在已经尝试让 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 上它不起作用。

4

1 回答 1

15

好的,我在一个旧的 Github 问题中找到了解决这个问题的方法。显然,您需要拥有 wifi 多播权限,并且需要获取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
于 2018-12-05T11:02:20.693 回答