WiFiDirect discoveryServices продолжает сбой с ошибкой 3 (NO_SERVICE_REQUESTS)

Я использую 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.


person Cypress Frankenfeld    schedule 16.02.2014    source источник
comment
где вы получаете сообщение об ошибке? Я имею в виду каким методом? если вы посмотрите на это, я d говорят, что в вашем методе setServiceListener что-то не так. Вы останавливаете свой сервис onStop() или где-то еще?   -  person Saeid Farivar    schedule 26.02.2014
comment
Я получаю сообщение об ошибке в обратном вызове onFailure() для manager.discoverServices(). Я не прекращаю свою службу в onStop() или где-либо еще.   -  person Cypress Frankenfeld    schedule 26.02.2014
comment
Вероятно, это так. посмотрите это. вот как вы должны это сделать.   -  person Saeid Farivar    schedule 26.02.2014
comment
посмотреть на то? в чем дело?   -  person Cypress Frankenfeld    schedule 27.02.2014
comment
Я подозреваю, что причина появления этой ошибки в том, что вы не останавливаете свой сервис.... и я предложил ссылку в своем комментарии. stackoverflow.com/ questions/18679481/ Надеюсь, это будет полезно.   -  person Saeid Farivar    schedule 27.02.2014


Ответы (2)


Я вижу эту же проблему на Nexus 7 второго поколения. В первый раз все работает нормально, последующие попытки завершаются ошибкой. В частности, прослушиватель действий addServiceRequest сообщает об успехе, но затем discoverServices сообщает NO_SERVICE_REQUESTS.

(Разборка removeLocalService и removeServiceRequest завершается успешно перед выходом из приложения после первоначального успешного использования.)

Хотя это не идеальный ответ, выключение и повторное включение Wi-Fi, по-видимому, сбрасывает все, что застряло. Это можно сделать программно.

person Darrell    schedule 23.07.2014
comment
да... я думаю, что закончил тем, что сделал что-то подобное. Я так и не решил ошибку. - person Cypress Frankenfeld; 23.07.2014

WifiDirect/NSD на Android последние пару недель были моей занозой в боку.

Половину прошлой недели я потратил на то, чтобы понять, почему мои вызовы обнаружения одноранговых узлов не работают без какой-либо согласованности с 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");
        }
    });
}
person Makario    schedule 10.11.2014