WiFiDirect discoverServices 不断失败并出现错误 3 (NO_SERVICE_REQUESTS)

Posted

技术标签:

【中文标题】WiFiDirect discoverServices 不断失败并出现错误 3 (NO_SERVICE_REQUESTS)【英文标题】:WiFiDirect discoverServices keeps failing with error 3 (NO_SERVICE_REQUESTS) 【发布时间】:2014-02-16 21:14:32 【问题描述】:

我正在为network service discovery 使用 WiFi P2P,并且我正在按照开发人员指南中概述的说明进行操作。这是我的服务类中的相关代码:

public void onCreate() 
    manager = (WifiP2pManager) getSystemService(Context.WIFI_P2P_SERVICE);
    channel = manager.initialize(this, getMainLooper(), null);
    registerP2pService();
    lookForServices();


private void registerP2pService() 
    WifiP2pDnsSdServiceInfo serviceInfo =
            WifiP2pDnsSdServiceInfo.newInstance("_service.name", "_presence._tcp", new HashMap<String, String>());

    manager.addLocalService(channel, serviceInfo, new WifiP2pManager.ActionListener() 
        @Override
        public void onSuccess() 
            Log.i("tag", "REGISTERED SERVICE");
        

        @Override
        public void onFailure(int arg0) 
            Log.e("tag", "FAILED to register service");
        
    );


private void setServiceListeners() 
    WifiP2pDnsSdServiceRequest serviceRequest = WifiP2pDnsSdServiceRequest.newInstance();
    manager.addServiceRequest(channel, serviceRequest,
        new WifiP2pManager.ActionListener() 
        @Override
        public void onSuccess() 
            Log.d("SCOPE", "Added a service request.");
            discoverServices();
        

        @Override
        public void onFailure(int code) 
            Log.e("tag", "Error adding service request.");
        
   );



public void discoverServices() 
    manager.discoverServices(channel, new WifiP2pManager.ActionListener() 

        @Override
        public void onSuccess() 
            Log.d("tag", "Service discovery was initiated");
        

        @Override
        public void onFailure(int code) 
            // This is where it keeps failing with error code 3 (NO_SERVICE_REQUESTS)
            Log.d("SCOPE", "Service discovery failure code "  + code);
        
    );

我在重启手机后第一次运行我的服务时,服务发现启动得很好,但是如果我通过从应用程序设置页面停止服务来终止服务,然后再次打开它,它总是失败并显示错误代码 3。如果我重新启动手机并再次运行该应用程序,它就可以正常工作。我很困惑,因为我只有在成功添加服务请求时才显式调用discoverServices。

我的直觉是,这可能是由于一些与服务发现无关的代码,因为服务发现代码看起来非常简单,但如果您发现我发布的内容有任何问题,请告诉我。我在这里抓住了稻草。

我在装有 android 4.4.2 的 Nexus 5 上运行它。

【问题讨论】:

您在哪里收到错误消息?我的意思是用哪种方法?如果您查看this,我会说您的 setServiceListener 方法有问题。您是在 onStop() 还是某处停止服务? 我在manager.discoverServices()onFailure() 回调中收到错误消息。我不会在onStop() 或其他任何地方停止我的服务。 大概就是这样。看看this。你应该这样做。 看什么?这是什么情况? 我怀疑看到这个错误的原因是你没有停止你的服务......我在我的评论中建议了一个链接。 ***.com/questions/18679481/…希望有用。 【参考方案1】:

我在第二代 Nexus 7 上看到了同样的问题。它第一次运行良好,随后的尝试出错。具体来说,addServiceRequest 操作侦听器报告成功,但随后 discoverServices 报告 NO_SERVICE_REQUESTS。

(初次使用成功后退出应用前拆解removeLocalServiceremoveServiceRequest成功。)

虽然这不是一个理想的答案,但关闭然后再打开 wifi 似乎可以重置任何卡住的东西。这可以通过编程方式完成。

【讨论】:

是的......我想我最终做了类似的事情。我从来没有解决过这个错误。【参考方案2】:

过去几周,Android 上的 WifiDirect/NSD 一直困扰着我。

上周我花了一半的时间试图弄清楚为什么我的对等发现调用会失败,而与 NO_SERVICE_REQUESTS 没有任何一致性,最终找到了一个运行良好的解决方案。这似乎是操作系统中的一个错误,幸运的是 P2Feed 的优秀人员发现了一个workaround:

if (code == WifiP2pManager.NO_SERVICE_REQUESTS) 

    // initiate a stop on service discovery
    manager.stopPeerDiscovery(channel, new WifiP2pManager.ActionListener() 
        @Override
        public void onSuccess() 
            // initiate clearing of the all service requests
            manager.clearServiceRequests(channel, new WifiP2pManager.ActionListener() 
                @Override
                public void onSuccess() 
                    // reset the service listeners, service requests, and discovery
                    setServiceListeners();
                

                @Override
                public void onFailure(int i) 
                    Log.d(TAG, "FAILED to clear service requests ");
                
            );

        

        @Override
        public void onFailure(int i) 
            Log.d(TAG, "FAILED to stop discovery");
        
    );

【讨论】:

以上是关于WiFiDirect discoverServices 不断失败并出现错误 3 (NO_SERVICE_REQUESTS)的主要内容,如果未能解决你的问题,请参考以下文章

在android上的wifidirect中更改设备名称

Android WiFiDirect 服务发现混乱

Wifi 直连发现

WiFiDirect discoverServices 不断失败并出现错误 3 (NO_SERVICE_REQUESTS)

使不安全的 WiFi 网络可用

将 iPhone 连接到 Android 的 Wifi Direct 软 AP