6

我正在使用 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 上运行它。

4

2 回答 2

9

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

(初次使用成功后退出应用前拆机removeLocalService并成功。)removeServiceRequest

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

于 2014-07-23T00:42:22.357 回答
7

在过去的几周里,Android 上的 WifiDirect/NSD 一直是我的眼中钉。

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

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");
        }
    });
}
于 2014-11-10T15:58:46.780 回答