我正在为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上运行此功能。
答案 0 :(得分:9)
我在第二代Nexus 7上看到同样的问题。第一次正常工作,后续尝试错误。具体来说,addServiceRequest
操作侦听器报告成功,但discoverServices
报告NO_SERVICE_REQUESTS。
(拆分removeLocalService
和removeServiceRequest
在初次成功使用后退出应用程序之前已成功。)
虽然它不是一个理想的答案,但是关闭然后再打开wifi似乎会重置被卡住的内容。这可以以编程方式完成。
答案 1 :(得分:7)
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");
}
});
}