2013-08-07 7 views
6

मैं NsdManager.DiscoveryListener.onServiceFound() पर पैरामीटर के रूप में पारित NsdServiceInfo का mhost प्राप्त करने का प्रयास कर रहा हूं लेकिन यह शून्य है। मेरे पास दो एंड्रॉइड डिवाइस हैं जहां डिवाइस 1 सर्वर है और डिवाइस 2 क्लाइंट है।होस्ट NsdManager की NsdServiceInfo में शून्य है। DiscoveryListener.onServiceFound

इस तरह मैं डिवाइस 1

public void registerService(int port, InetAddress myIp) { 
    NsdServiceInfo serviceInfo = new NsdServiceInfo(); 
    serviceInfo.setPort(port); 
    serviceInfo.setServiceName(this.serviceName); 
    serviceInfo.setServiceType(SERVICE_TYPE); 
    serviceInfo.setHost(myIp); 

    this.nsdManager.registerService(
      serviceInfo, NsdManager.PROTOCOL_DNS_SD, registrationListener); 
} 

में सर्वर रजिस्टर और यह मैं कैसे DiscoveryListener

public void initializeDiscoveryListener() { 
    discoveryListener = new NsdManager.DiscoveryListener() { 

     @Override 
     public void onServiceFound(NsdServiceInfo service) { 
      Log.d(TAG, "Service discovery success" + service); 
      if (!service.getServiceType().equals(SERVICE_TYPE)) { 
       Log.d(TAG, "Unknown Service Type: " + service.getServiceType()); 
      } else if (service.getHost() == myIp) { 
       Log.d(TAG, "Same machine: " + service.getHost()); 
      } else if (service.getServiceName().contains(serviceName)){ 
       nsdManager.resolveService(service, resolveListener); 
      } 
     } 
    ... 
    } 
} 

लेकिन service.getHost() रिटर्न अशक्त प्रारंभ है।
कोई सुझाव?

उत्तर

13

मैं बस इसी मुद्दे पर भाग गया और नेटवर्क खोज पर Google के पृष्ठ से थोड़ी मदद के साथ इसे हल करने में कामयाब रहा।

http://developer.android.com/training/connect-devices-wirelessly/nsd.html

समस्या यह है कि कनेक्शन जानकारी ज्ञात नहीं है जब सेवा की खोज की है है। GetHost() काम करने से पहले आपको इसे हल करना होगा।

nsdManager.resolveService(service, resolveListener); 

resolveListener चर सफलता और विफलता के लिए कॉलबैक शामिल हैं:

आप पहले से ही लाइन है। जब आप कनेक्शन जानकारी सफलतापूर्वक निर्धारित की जाती है तो आप GetHost() का उपयोग करना चाहते हैं। यहां Google से संकल्प श्रोता है:

public void initializeResolveListener() { 
     resolveListener = new NsdManager.ResolveListener() { 

     @Override 
     public void onResolveFailed(NsdServiceInfo serviceInfo, int errorCode) { 
      // Called when the resolve fails. Use the error code to debug. 
      Log.e(TAG, "Resolve failed" + errorCode); 
     } 

     @Override 
     public void onServiceResolved(NsdServiceInfo serviceInfo) { 
      Log.e(TAG, "Resolve Succeeded. " + serviceInfo); 

      if (serviceInfo.getServiceName().equals(mServiceName)) { 
       Log.d(TAG, "Same IP."); 
       return; 
      } 
      service = serviceInfo; 
      int port = service.getPort(); 
      InetAddress host = service.getHost(); // getHost() will work now 
     } 
    }; 
} 
+0

Android में नमूना कोड पुराना है, उन्हें आपके कोड परिवर्तन के बाद कोड अपडेट करना चाहिए। : डी – mxi1

+0

दुर्भाग्य से, resolService (...) बिल्कुल काम नहीं करता है। .onServiceDiscovered() प्राप्त करते समय, एक ".local" हमेशा प्रोटोकॉल टाइप में (NsdManager!) जोड़ा जाएगा, हालांकि यह ".local" संकल्प सेवा() को भ्रमित करता है। अज्ञात त्रुटि परिणाम है। यदि .local हटा दिया गया है, तो पहले कॉल में (हमेशा नए Resolvelistener) से कोई कॉलबैक प्राप्त नहीं होता है, जबकि दूसरा कॉल त्रुटि NsdManager देता है। FAILURE_ALREADY_ACTIVE: // = 3। लेकिन चूंकि यह प्रत्येक कॉल पर बनाया गया एक नया उदाहरण है, यह अर्थहीन है, जब तक कि सिंगलटन तंत्र यहां छिपी न हो। गहराई से परेशान अपरिपक्वता। – carl

+0

मैं जोड़ सकता हूं कि कई संकल्प कॉल करने का कारण यह है कि स्थानीय नेटवर्क पर एक से अधिक सेवा की खोज की जाती है। – carl

संबंधित मुद्दे