Android 5.1.1可检测MDNS/Zeroconf设备,Android 7无响应求助
嘿,我之前在做类似的ZeroConf设备发现功能时,也碰到过Android 7及以上版本突然失效的情况,结合你用的cordova-plugin-zeroconf和_telnet._tcp服务类型,给你几个实际可行的排查和解决方向:
Android 7(API 24)开始对本地网络多播和权限做了更严格的管控,你得确保AndroidManifest.xml里配置了必要的权限:
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE" /> <uses-permission android:name="android.permission.INTERNET" /> <!-- 如果你的应用还要兼容Android 10+,必须加上这个位置权限 --> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
重点是CHANGE_WIFI_MULTICAST_STATE——ZeroConf依赖多播包来发现服务,Android 7对这个权限的校验比之前更严,缺失的话直接会导致服务发现失败。
旧版本的插件可能没适配Android 7的网络变化,我之前就是因为用了3.x的旧版本,升级到最新稳定版后问题直接解决了。执行以下命令更新:
cordova plugin remove cordova-plugin-zeroconf cordova plugin add cordova-plugin-zeroconf@latest
更新后记得重新构建Android项目,别忘清一下构建缓存。
你现在的find方法用了Promise,但看起来没处理错误分支,Android 7下可能有错误抛出但没被捕获,导致你误以为“无任何响应”。建议补充错误处理:
find(type) { return new Promise((resolve, reject) => { zeroconf.watch(type, 'local.', (result) => { const action = result.action; if (action === 'added') { console.log('发现目标设备:', result.service); resolve(result.service); } }, (error) => { // 这里打印错误日志,方便排查 console.error('ZeroConf服务发现失败:', error); reject(error); }); }); }
然后打开Android Studio的Logcat,搜索ZeroConf或者你的日志关键词,看看有没有权限拒绝、多播失败之类的具体错误提示。
有时候问题不一定出在你的应用上,可能是待检测设备的Telnet服务没正确注册ZeroConf信息。你可以用其他工具(比如电脑上的Bonjour浏览器)在同一私有网络里扫描_telnet._tcp服务,看看能不能找到目标设备。如果其他工具也找不到,那就要排查目标设备的服务配置了。
如果以上方法都不行,可能是插件没正确获取多播锁定,你可以尝试通过原生代码扩展或者修改插件源码来手动获取:
WifiManager wifiManager = (WifiManager) getApplicationContext().getSystemService(Context.WIFI_SERVICE); WifiManager.MulticastLock multicastLock = wifiManager.createMulticastLock("zeroconf_discovery_lock"); multicastLock.acquire(); // 注意:在不需要发现服务的时候记得释放锁 // multicastLock.release();
不过这个方案比较麻烦,优先建议用前面的方法解决。
按照这个顺序排查,大概率能解决Android 7上的无响应问题。
内容的提问来源于stack exchange,提问作者Jason Crosby

