Cyp*_*eld 6 android service-discovery android-service wifi-direct wifip2p
我正在使用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);
}
});
}
Run Code Online (Sandbox Code Playgroud)
重新启动手机后第一次运行我的服务时,服务发现启动就好了,但如果我通过从应用程序设置页面停止服务来终止服务,然后再次打开它,它总是会失败并显示错误代码3.如果我重新启动我的手机再次运行应用程序它工作得很好.我很困惑,因为我只在成功添加服务请求时显式调用discoverServices.
我的预感是,它可能是由于某些代码与服务发现无关,因为服务发现代码似乎非常简单,但如果您发现我发布的内容有任何问题,请告诉我.我在这里抓住稻草.
我在Android 4.4.2的Nexus 5上运行它.
我在第二代Nexus 7上看到了同样的问题.第一次工作正常,后续尝试错误.具体来说,addServiceRequest动作侦听器报告成功,但随后discoverServices报告NO_SERVICE_REQUESTS.
(在初次成功使用后离开应用程序之前,已拆解removeLocalService并removeServiceRequest取得成功.)
虽然它不是一个理想的答案,但再次打开wifi然后再次打开可能会重置被卡住的内容.这可以以编程方式完成.
在过去的几周里,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");
}
});
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2372 次 |
| 最近记录: |