首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NsdManager发现在Android 9上不起作用

NsdManager发现在Android 9上不起作用
EN

Stack Overflow用户
提问于 2018-12-04 14:27:48
回答 1查看 2.3K关注 0票数 3

我已经尝试了一个很好的时间让NsdManager发现功能在Android9上工作,在此之前,它可以在任何安卓版本上工作,没有任何问题。

为了测试目的,我使用了这个简单的代码片段,清单中有"INTERNET“的权限。

代码语言:javascript
复制
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“以及所有预期设备的所有相应响应。这些回复似乎没有在安卓系统上收到,因为"onServiceFound“函数从来没有被调用过。事实上,除了"onDiscoveryStared“之外,没有任何函数被调用。

我还没有看到Android 9的任何变化,也没有看到它为什么不起作用,任何帮助都是很高兴的。也许我做错了什么,或者错过了当前Android版本的任何权限更改。

更新:在三星的S9+上,目前的Android9beta版,服务发现工作没有任何问题。在我的Pixel 3XL的另一边,它不工作。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-12-05 11:02:20

好的,我在一个旧的Github问题中找到了这个问题的解决方案。显然,您需要拥有wifi多播权限,并且需要获得一个MulticastLock来接收多播消息。

我还没有找到任何有关这方面的文档,这似乎不是Android 9的一个特定问题,而是Google默认设置,禁用所有监听多播包以保留电池。

对于任何想要解决这个问题并且不想深入研究长时间问题的人,我添加了以下代码:

AndroidManifest.xml:

代码语言:javascript
复制
<uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE"/>

浏览器:

代码语言:javascript
复制
WifiManager wifi = (WifiManager) mContext.getSystemService(Context.WIFI_SERVICE);
WifiManager.MulticastLock multicastLock = wifi.createMulticastLock("multicastLock");
multicastLock.setReferenceCounted(true);
multicastLock.acquire();
.
.
multicastLock.release(); // release after browsing
票数 19
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53615125

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档