6

Ich verwende WiFi P2P für network service discovery, und ich befolge die Anweisungen wie im Entwicklerhandbuch beschrieben. Hier ist der relevante Code in meiner Dienstklasse:WiFiDirect discoverServices bleibt mit Fehler 3 (NO_SERVICE_REQUESTS)

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); 
     } 
    }); 
} 

Das erste Mal, dass ich meinen Dienst ausführen, nachdem das Telefon neu zu starten, Service Discovery ist ganz gut begonnen, aber wenn ich den Dienst töten, indem es von der App-Einstellungen Seite zu stoppen, dann öffne es wieder, es schlägt immer mit Fehlercode 3 fehl. Wenn ich mein Telefon neu starte und die App erneut starte, funktioniert es gut. Ich bin verwirrt, weil ich discoverServices nur dann explizit anrufe, wenn die Serviceanforderung erfolgreich hinzugefügt wurde.

Meine Vermutung ist, dass es an einem Code liegen kann, der nichts mit Service Discovery zu tun hat, da der Service Discovery Code extrem einfach zu sein scheint, aber wenn Sie irgendetwas falsch sehen, lassen Sie es mich wissen. Ich fasse hier Strohhalme.

Ich führe dies auf einem Nexus 5 mit Android 4.4.2.

+0

wo Sie den Fehler zu erhalten? Ich meine, in welcher Methode? Wenn du dir [this] (http://developer.android.com/reference/android/net/wifi/p2p/WifiP2pManager.html#P2P_UNSUPPORTED) anschaust, würde ich sagen, dass deine setServiceListener-Methode nicht in Ordnung ist. Stoppen Sie Ihren Dienst onStop() oder irgendwo? –

+0

Ich erhalte den Fehler im 'onFailure()' Callback von 'manager.discoverServices()'. Ich stoppe meinen Dienst nicht in 'onStop()' oder anderswo. –

+0

Das ist wahrscheinlich der Fall. sieh dir [this] an (http://stackoverflow.com/questions/18679481/wifi-direct-end-connection-to-peer-on-android). So solltest du es tun. –

Antwort

9

Ich sehe das gleiche Problem auf einer zweiten Generation Nexus 7. Es funktioniert gut das erste Mal, nachfolgende Versuche Fehler aus. Insbesondere meldet der addServiceRequest Action-Listener Erfolg, aber dann meldet discoverServices NO_SERVICE_REQUESTS.

(Teardown removeLocalService und removeServiceRequest erfolgreich sein, bevor die App nach dem ersten erfolgreichen Einsatz zu beenden.)

Während es keine ideale Antwort ist, Wi-Fi Makeln aus und dann wieder erscheint zurückgesetzt, was hängen geblieben ist. Das kann programmatisch gemacht werden.

+0

yeah ... Ich denke, dass ich so etwas gemacht habe. Ich habe den Fehler nie gelöst. –

+0

danke für den Hinweis, gespeichert viel Zeit. –

6

WifiDirect/NSD auf Android ist in den letzten Wochen ein Dorn im Auge.

Ich verbrachte die Hälfte der letzten Woche damit, herauszufinden, warum meine Peer-Discovery-Aufrufe ohne Konsistenz mit NO_SERVICE_REQUESTS fehlschlagen würden, und fand schließlich eine Lösung, die ziemlich gut funktioniert. Es scheint ein Fehler im Betriebssystem zu sein, und zum Glück der fein Leute von P2Feed ein workaround herausgefunden:

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"); 
     } 
    }); 
}