NsdManager 发现在 Android 9 上不起作用

2023-12-01

我已经尝试了很长时间,让 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,我可以看到广播的 mDNS 标准查询“_https._tcp.local”以及来自所有预期设备的所有相应响应。 Android 上似乎没有收到响应,因为函数“onServiceFound”从未被调用。事实上,除了“onDiscoveryStared”之外,没有任何函数被调用。

我还没有看到 Android 9 上有任何关于为什么这不应该工作的变化,我们很高兴提供任何帮助。也许我做错了什么或者错过了当前 Android 版本中的任何权限更改。

更新:在运行当前 Android 9 beta 的三星 S9+ 上,服务发现工作没有任何问题。在我的另一侧 Pixel 3XL 上,它不起作用。


好的,我在旧的版本中找到了解决这个问题的方法Github问题。显然你需要有wifi多播权限并且需要获取组播锁接收多播消息。

我还没有找到任何有关此问题的文档,这似乎不是 Android 9 的特定问题,而是 Google Pixel 默认设置,用于禁用对多播包的所有侦听以节省电池。

对于遇到此问题并且不想深入研究长期问题的任何人,我添加了以下代码:

AndroidManifest.xml:

<uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE"/>

Browser:

WifiManager wifi = (WifiManager) mContext.getSystemService(Context.WIFI_SERVICE);
WifiManager.MulticastLock multicastLock = wifi.createMulticastLock("multicastLock");
multicastLock.setReferenceCounted(true);
multicastLock.acquire();
.
.
multicastLock.release(); // release after browsing
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

NsdManager 发现在 Android 9 上不起作用 的相关文章

随机推荐

  • 安装factoextra时rbind(info, getNamespaceInfo(env, "S3methods")) 出错

    我正在尝试在 Windows 上使用本地源 tar 球安装 factoextra 包 我可以用同样的方式安装其他软件包 没有问题 但是 在安装 factoextra 时 我收到与 S3methods 相关的错误 我尝试使用本地 Window
  • 如何使用 css 模糊图像,同时在图像上显示文本(悬停)

    可以 然后呢 我有个问题 我想要一张悬停时模糊的图片 同时让文字出现在它上面 我找到了一种简单的方法来模糊图像并显示文本 但不能同时显示两者 事实上 将两个代码合并在一起可以使图片看起来一点也不模糊 我认为这是因为文本实际上覆盖了图像 并且
  • WPF 中的网格表

    我需要创建一个网格 应该是可编辑的我应该设置行数和列数 例如 mygrid RowCount 3 mygrid ColumnCount 3 它应该是这样的 如何将二维数组绑定到DataGrid 您可以使用 WPF DataGrid 控件 它
  • 将 JSON 文件加载到 BigQuery 表时如何管理/处理架构更改

    我的输入文件如下所示 Id 1 Address Street MG Road City Pune Id 2 Address City Mumbai Id 3 Address Street XYZ Road Id 4 Id 5 PhoneNu
  • PostgreSQL - 不一致的复制权限错误

    我在 Windows 7 32 位计算机上使用 EnterpriseDB pgAdmin III v 1 12 1 来处理远程 Linux 服务器上的 PostgreSQL 数据库 我以用户 postgres 身份登录 这允许我访问 PGD
  • 在 JSF 模板内进行过滤是个好主意吗?

    我必须说的第一件事是 我从未在 Java Web 应用程序上使用 Web 过滤器 所以这可能是一个愚蠢的想法 我正在尝试创建一种方法 可以检查用户的权限 并在用户是否可以访问某些页面时授予其访问权限 为了更好的解释 我将举一个例子 您应该想
  • 我在尝试将 python 与 mysql 链接时遇到错误

    TypeError init takes 1 positional argument but 5 were given 这是错误 我将分享以下脚本 import pymysql print DATABASE CONNECTION SAMPL
  • 为什么 eclipse 不重新编译对我的 Java 类所做的最后更改?

    我有一个简单的文件 只有 1 行 在 main 中打印 Hello World 我执行它并在 eclipse 控制台上打印 Hello World 现在当我将字符串更改为 再见世界 它仍然打印 你好世界 事实上 如果我通过将 println
  • 带有签名的图像未按预期定位

    我正在开发一个 SwiftUI 项目 我想将签名图像叠加在另一个图像之上 并允许用户操纵签名图像的位置 比例和旋转 但是 我在签名图像的定位方面遇到了问题 并且它没有出现在我期望的位置 我尝试设置用于拖动 缩放和旋转签名图像的手势 但它的行
  • 如何使用ajax在javascript中调用java类方法?

    我有一个java类 package MyPackage import java sql Connection import java sql DriverManager import java sql ResultSet import ja
  • Woocommerce 获取购物车项目元

    我的产品页面上有一个 自定义字段 我想将其添加到 Woocommerce 购物车页面中的产品标题上方 这是自定义字段数据 我用这个 PHP 代码让它在单个产品卡上工作 add action woocommerce after shop lo
  • 如何在 Windows 计算机上从命令提示符运行 PHP 程序?

    I m a PHP开发人员按职业 我正在使用一个联想 Ideapad 笔记本电脑运行于Windows 10 家庭单语言 64 位操作系统 我也安装了XAMPP 控制面板 v3 2 2在地点 C xampp 执行PHP程序 in a 网页浏览
  • 如何将操作应用到选定的多个 Outlook 项目?

    代码here仅适用于一件物品 如何修改它来运行DisplayItemMetadata 参见代码 对于每个选定的项目 更新 尝试执行以下操作 For Each individualItem In Application ActiveExplo
  • 如何在 Windows 上更新 winpython 中的 scipy?

    我已经安装了 winpython 我想将 scipy 更新到版本 0 14 我怎样才能做到这一点 我应该完全重新安装 winpython 吗 EDIT 如果我跑pip install upgrade scipy来自WinPython Com
  • 运行多个工作守护进程 SLURM

    我想在一台机器上运行多个工作守护进程 按照达米安弗朗索瓦的回答关于slurm 集群的最少计算机数量是多少可以办到 问题是目前我只能在一台机器上执行 1 个工作守护进程 例如 当我跑步时 sudo slurmd N linux1 cDvv s
  • 在 UML 中设置关联最终所有权:对于可视化范式(或其他 UML 工具)中生成的代码意味着什么?

    将关联端所有权从 关联 设置为 分类器 对生成的代码有何影响 换句话说 0 我从一个空图表开始 1 我创建A类和B类 2 我用关联A B连接A和B 3 A处的关联端被命名为a 4 B处的关联端命名为b 5 a 的关联端所有权设置为 B 类
  • 如何仅获取外键过滤器的最新记录

    我有一张这样的桌子 事件表 id status date order FK 1 Planned 05 02 2015 1 2 Delivered 04 02 2015 2 3 Packed 03 02 2015 3 4 Return 06
  • 如何衡量图像检测算法的成功率和准确率?

    有谁知道如何正确量化图像检测算法的成功 如何结合这两个误差源 因为一个来源是算法未能检测到的对象数量 另一个来源是算法错误识别为对象的误报数量 例如 如果图像中有 574 个物体 但算法只检测到其中 540 个 同时产生 113 个误报 那
  • 动态重命名方法

    我们可以在类定义时使用元类重命名类方法 这个问题是not关于那个 这更像是一个思想实验 所以请稍微幽默一下 假设我想编写两个这样使用的装饰器 class SomeClass object append A def some method s
  • NsdManager 发现在 Android 9 上不起作用

    我已经尝试了很长时间 让 NsdManager 发现功能在 Android 9 上运行 它可以在之前的任何 Android 版本上运行 没有任何问题 出于测试目的 我使用这个简单的代码片段 并且清单中存在 INTERNET 权限 var n