检测 MDNS/Zeroconf 设备适用于 Android 5.1.1,但不适用于 Android 7

Posted

技术标签:

【中文标题】检测 MDNS/Zeroconf 设备适用于 Android 5.1.1,但不适用于 Android 7【英文标题】:Detecting MDNS/Zeroconf device works on Android 5.1.1 but not on Android 7 【发布时间】:2018-09-01 08:03:33 【问题描述】:

我在无法访问互联网的专用网络上检测到设备。网络上唯一的设备是我正在检测的设备以及具有我当前正在使用的应用程序的移动设备或 PC。这个词在 android 5.1.1 上很好,但在 7 上,我没有得到任何回应,就像它没有找到任何东西一样。这是我用来检测设备的代码。我使用的类型是_telnet._tcp.,我在这里使用的Cordova插件是cordova-plugin-zeroconf

find(type) // javascript
    return new Promise((resolve, reject) => 
        cordova.plugins.zeroconf.watch(type, "local.", (result) => 
            var action = result.action;
            var service = result.service;

            if (action == 'added') 
                console.debug('service added', service);
            
            else if (action == 'resolved') 
                console.debug('service resolved', service);
                resolve( status: "resolved", service: service );
            
            else 
                console.debug('service removed', service);
                resolve( status: "removed", service: service );
            
        , (error) => 
            reject(error);
        );
    );

我最初认为这可能是因为权限问题,所以我将其添加到 Cordova Android 项目中的MainActivity。我可以看到它记录“有权限”。

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) //java
    Log.d(TAG, "version 23 or more");
    if (checkSelfPermission(Manifest.permission.ACCESS_WIFI_STATE) == PackageManager.PERMISSION_GRANTED &&
        checkSelfPermission(Manifest.permission.CHANGE_WIFI_MULTICAST_STATE) == PackageManager.PERMISSION_GRANTED &&
        checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) 
    Log.d(TAG, "has permission");

else 
    Log.d(TAG, "no permission");
    requestPermissions(new String[]  Manifest.permission.ACCESS_WIFI_STATE,
            Manifest.permission.CHANGE_WIFI_MULTICAST_STATE, 
            Manifest.permission.WRITE_EXTERNAL_STORAGE , 0);
    

【问题讨论】:

我确实在 Android 7 平板电脑上安装了第三方浏览器应用,并且能够看到我要查找的设备。 我已经在 2 台运行 7.0 的 Android 设备和一台运行 7.1.1 的 Android 设备上进行了尝试,但它们都找不到我需要连接的设备。从 7.0 开始,是否对 Android 进行了任何更改,使其无法正常工作? 【参考方案1】:

我最终重做插件以使用Android's Network Service Discovery (NSD)。我能够让它与它一起工作。对于我的生活,我不知道为什么该插件不适合我。我从来没有发现是什么导致它无法工作。

【讨论】:

您是否碰巧在任何地方共享了更新后的代码? 不,遗憾的是它不公开。不过实现起来并不难。

以上是关于检测 MDNS/Zeroconf 设备适用于 Android 5.1.1,但不适用于 Android 7的主要内容,如果未能解决你的问题,请参考以下文章

适用于所有设备的 HTML5 应用程序的媒体查询

适用于 Windows 8.1 应用商店应用的蓝牙低功耗服装服务设备发现和开发

检测连接的 USB 设备

MediaRouteButton 检测设备的回调

检测核心位置的 iPhone 设备功能

检测移动设备中的当前地理位置