2011-03-25 88 views
1

我想讓JmDNS在我的android程序中工作。我能夠通過它來發現我想要的設備,但是我不完全瞭解如何從JmDNS獲取信息到啓動JmDNS任務的對象。這是我的代碼。在Android /多線程上實現JmDNS

protected void browse() {  
     try { 
     jmdns = (JmDNSImpl) JmDNS.create(); 

     jmdns.addServiceListener(type, listener = new ServiceListener() { 
      public void serviceResolved(ServiceEvent ev) { 

      } 
      public void serviceRemoved(ServiceEvent ev) {     

      } 
      public void serviceAdded(ServiceEvent event) {  
       DNSEntry addressEntry = jmdns.getCache().getDNSEntry(name, DNSRecordType.TYPE_A, DNSRecordClass.CLASS_ANY); 
       if (addressEntry instanceof DNSRecord) { 
        ServiceInfo cachedAddressInfo = ((DNSRecord) addressEntry).getServiceInfo(true); 
        if (cachedAddressInfo != null) { 
         for (Inet4Address address : cachedAddressInfo.getInet4Addresses()) { 
          //I need to get the address that is here back out of this listener to the main thread 
         } 
        } 
       } 
      } 

     }); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

我遇到的問題是,我有有有它的瀏覽方法瀏覽器對象的實例的服務管理對象。我無法讓服務管理器對象訪問地址變量。因爲JmDNS在創建它時創建了自己的線程來運行它的任務,所以我試圖使用一個處理程序和可運行的函數來發送帶有變量的消息,但是我似乎無法做到。誰能幫忙?

回答

1

我想你只想使用ServiceEvent事件對象傳入服務添加方法。它有你需要的所有信息。

從我們的開源應用程序中看到這個例子

http://code.google.com/p/tunesremote-plus/source/browse/trunk/src/org/tunesremote/LibraryActivity.java

+0

是啊,這是它是如何工作的,但由於某種原因JmDNS無法解析服務類型的IP地址,我想等我實際上必須深入研究JmDNS緩存以獲取它在不同服務類型下獲得的IP地址。 – Sam 2011-03-25 14:10:22

+0

你不應該這樣做。 IP地址應該在列表中可用。 event.ServiceInfo對象有兩個方法可用於getIP4VAddresses()和getIPV6Addresses(),它們絕對可行。 – Melloware 2011-03-25 14:15:52

+1

您是否嘗試將代碼移至serviceResolved而不是Added?補充是當它被通知有一個新的服務,解決之後,它從Bonjour服務獲得所有信息,如IP地址等。 – Melloware 2011-03-25 14:18:14