2012-03-27 6 views
1

私はAndroid AVDでJmDNSを動作させるのにいくつかの問題がありました。私は3つのアプリケーションを作成しました。 ServiceListenerを登録してアクティビティを記録するAndroidアプリケーション、Androidアプリケーションと同じことを行うJavaアプリケーション、サービスを登録する別のJavaアプリケーション。 Javaリスナーアプリケーションは、他のJavaアプリケーションでピックアップされますが、アンドロイドアプリケーションは受け取りません。私はまた、2人のAVDを同時に走らせて、お互いに迎え入れるかどうかを見てみました。私はまた、私はインターネットとCHANGE_WIFI_MULSTICAST_STATEが有効になっている許可を持っていることを言及する必要があります。Android AVDがJmDNSサービスに気づくことができません

のAndroidアプリケーション:

public class BonjourActivity extends Activity { 

    // Multicast 
    private WifiManager wifi; 
    private MulticastLock lock; 
    private JmDNS jmdns; 
    private String type = "_im._tcp.local."; 
    private ServiceListener listener; 
    private ServiceInfo serviceInfo; 

    // On Create 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     // Multicast 
     wifi = (WifiManager) getSystemService(Context.WIFI_SERVICE); 
     lock = wifi.createMulticastLock(""); 
     lock.setReferenceCounted(true); 
     lock.acquire(); 

     // JmDNS 
     new AsyncTask<Object, Object, Object>(){ 
      @Override 
      protected Object doInBackground(Object... params) { 
       // Create JmDNS 
       try { 
        jmdns = JmDNS.create(); 
       } catch (IOException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
       return null; 
      } 
      protected void onPostExecute(Object result) { 
       // Add Listener 
       jmdns.addServiceListener(type, listener = new ServiceListener(){ 
         @Override 
         public void serviceAdded(ServiceEvent ev) { 
          jmdns.requestServiceInfo(ev.getType(), ev.getName(), 1); 
         } 
         @Override 
         public void serviceRemoved(ServiceEvent ev) { 
          Log.d("Service", "Service Removed: " + ev.getName()); 
         } 
         @Override 
         public void serviceResolved(ServiceEvent ev) { 
          Log.d("Service", "Service Resolved: " + ev.getInfo().getURL()); 
         } 
        }); 
      } 
     }.execute(); 
    } 

    // On Destroy 
    public void onDestroy(){ 
     // Release Lock 
     if (lock != null){ 
      lock.release(); 
     } 
     // Close JmDNS 
     if (jmdns != null){ 
      jmdns.removeServiceListener(type, listener); 
      try { 
       jmdns.close(); 
      } catch (IOException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
     } 
     super.onDestroy(); 
    } 
} 

Javaのリスナーアプリケーション:

public class Listener { 

    private static JmDNS jmdns; 
    private static String type = "_im._tcp.local."; 
    private static ServiceListener serviceListener; 
    private static ServiceInfo serviceInfo; 

    // Main 
    public static void main(String args[]){ 

     try { 
      jmdns = JmDNS.create(); 
      jmdns.addServiceListener(type, serviceListener = new ServiceListener(){ 
       @Override 
       public void serviceAdded(ServiceEvent ev) { 
        System.out.println("Service Added: " + ev.getName()); 
        jmdns.requestServiceInfo(ev.getType(), ev.getName(), 1); 
       } 
       @Override 
       public void serviceRemoved(ServiceEvent ev) { 
        System.out.println("Service Removed: " + ev.getName()); 
       } 
       @Override 
       public void serviceResolved(ServiceEvent ev) { 
        System.out.println("Service Resolved: " + ev.getInfo().getURL()); 
       } 
      }); 
      System.out.println("Listener Added"); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

    } 

} 

のJava送信側アプリケーション:

public class Sender { 

    private static JmDNS jmdns; 
    private static String type = "_im._tcp.local."; 
    private static ServiceListener serviceListener; 
    private static ServiceInfo serviceInfo; 

    // Main 
    public static void main(String args[]){ 

     try { 
      jmdns = JmDNS.create(); 
      serviceInfo = ServiceInfo.create(type, "Test IM Service", 55555, "Instant messaging test service"); 
      jmdns.registerService(serviceInfo); 
      System.out.println("Sender: Service Created"); 
      new Timer().schedule(new TimerTask(){ 
       @Override 
       public void run() { 
        // TODO Auto-generated method stub 
        System.out.println("Closing.."); 
        jmdns.unregisterAllServices(); 
        try { 
         jmdns.close(); 
        } catch (IOException e) { 
         // TODO Auto-generated catch block 
         e.printStackTrace(); 
        } 
        System.exit(0); 
       } 
      }, 10000); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

    } 

} 
ここに私のコードです私は、アプリケーションを実行しようとすると、ほかに210

、LogCatは私にいくつかのエラーを与える:

NetworkManagementSocketTagger setKernelCountSet(10009,0)がerrnoで失敗しました-2

WifiStateMachineエラー!未処理のメッセージ{what = 131157 when = -1ms}

他のアプリケーションで生成されたJmDNSサービスでAndroidアプリケーションが起動できない理由は誰にも分かりますか?

+0

jMdns.addServiceListener(... onPostExecute()からdoInBackground()へのコードブロックを移動します。リスナーをインライン匿名クラスとして作成しない方が良いでしょう。 – yorkw

答えて

1

エミュレータで実行されている仮想デバイスは、コンピュータと同じネットワークにありません。サービスの検出が機能しない可能性があります。 jmdnsの実装はエミュレータでは機能しません。実際のデバイスで試してみてください。 詳細についてはhttp://home.heeere.com/tech-androidjmdns.htmlをご覧ください。

関連する問題