Я использую 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 только тогда, когда запрос на обслуживание был успешно добавлен.
Я предполагаю, что это может быть связано с некоторым кодом, не связанным с обнаружением службы, потому что код обнаружения службы кажется чрезвычайно простым, но если вы видите что-то не так с тем, что я опубликовал, дайте мне знать. Я хватаюсь за соломинку здесь.
Я запускаю это на Nexus 5 с Android 4.4.2.
onFailure()
дляmanager.discoverServices()
. Я не прекращаю свою службу вonStop()
или где-либо еще. - person Cypress Frankenfeld   schedule 26.02.2014