我正在将WiFi P2P用于network service discovery,并且正在遵循开发人员指南中概述的说明。这是我的服务类别中的相关代码:

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上运行此程序。

最佳答案

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

(删除removeLocalServiceremoveServiceRequest成功,在首次成功使用后退出应用程序。)

虽然这不是理想的答案,但先关闭wifi再重新打开似乎可以重置所有卡住的内容。这可以通过编程来完成。

08-25 22:47