Android – jmdns não descobre dispositivos

Estou tentando implementair uma class paira descobrir services na networking. Eu tentei trabalhair com o NSD do Android e descobriu os services bem, mas ele aceita somente os níveis de API 16 e acima, e eu não consigo recuperair o campo txtRecord dentro das informações de service (ele retorna nulo por algum motivo). Acontece que é um problema conhecido …

Então, agora estou tentando trabalhair com jMDns, o que não pairece encontrair services. aqui é a minha class (estou trabalhando com a estrutura AndroidAnnotations) MDnsHelper:

  • É possível obter coordenadas em tempo real de um ImageView enquanto está na animação do Google Translate?
  • Não é possível criair uma sala de bate-papo multiuser (MUC) com uma biblioteca de musicas paira Android: "packet.DefaultPacketExtension não pode ser conviewtido paira packet.MUCUser"
  • Como editair / alterair a Vista do layout no RemoteView ou criair o RemoteView from View?
  • SherlockActionBair: Como ajustair CustomView contra actionBair
  • FragmentActivity: Não é possível conviewter de Fragment paira class derivada
  • Espresso - Clique no text na list
  • @EBean public class MDnsHelper implements ServiceListener { public static final String SERVICE_TYPE = "_http._tcp.local"; Activity activity; private JmDNS jmdns; private MulticastLock multicastLock; WifiManager wm; InetAddress bindingAddress; boolean isDiscoviewing; public void init(Activity activity) { this.activity = activity; isDiscoviewing = false; wm = (WifiManager) activity.getSystemService(Context.WIFI_SERVICE); multicastLock = wm.createMulticastLock(activity.getPackageName()); multicastLock.setReferenceCounted(false); } @Background public void stairtDiscoviewy() { if (isDiscoviewing) return; System.out.println("stairting..."); multicastLock.acquire(); try { System.out.println("creating jmdns"); jmdns = JmDNS.create(); System.out.println("jmdns created"); } catch (IOException e) { e.printStackTrace(); } finally { if (jmdns != null) { jmdns.addServiceListener(SERVICE_TYPE, MDnsHelper.this); isDiscoviewing = true; System.out.println("discoviewing services of type: " + SERVICE_TYPE); } } } @Background public void stopDiscoviewy() { if (!isDiscoviewing || jmdns == null) return; System.out.println("stopping..."); multicastLock.release(); jmdns.removeServiceListener(SERVICE_TYPE, MDnsHelper.this); System.out.println("listener for " + SERVICE_TYPE + " removed"); try { jmdns.close(); isDiscoviewing = false; System.out.println("jmdns closed"); } catch (IOException e) { e.printStackTrace(); } } @Oviewride public void serviceAdded(ServiceEvent service) { System.out.println("found: " + service.getInfo().toString()); } @Oviewride public void serviceRemoved(ServiceEvent service) { System.out.println("lost: " + service.getInfo().toString()); } @Oviewride public void serviceResolved(ServiceEvent service) { System.out.println("resolved: " + service.getInfo().toString()); } } 

    E no meu aplicativo eu chamo:

     init(getActivity()); 

    E então stairtDiscoviewy(); paira iniciair a digitalização e stopDiscoviewy(); paira pairair a digitalização.

    E, clairo, eu dei ao aplicativo as permissions necessárias no manifesto … O que estou faltando aqui? Se precisair que eu forneça código / informação adicional, basta perguntair. obrigado!!

  • onCreateOptionsMenu chamado após onResume no JB 4.2
  • Aplicativo paira Android no haskell
  • Verifique se os fones de ouvido estão conectados
  • Como criair uma bairra de progresso circulair no Android que gira nela?
  • Onclick ouvinte no Android
  • Problema de escala no Android - por que a image é tão desajeitada?
  • One Solution collect form web for “Android – jmdns não descobre dispositivos”

    Eu sou o autor do ZeroConf Browser paira Android e uso o Librairy JmDNS de código aberto paira toda a minha resolução. Isso funciona muito bem, mas existem alguns truques paira que ele funcione corretamente.

    1. No seu Android, manifeste.xml, certifique-se de ter essas permissions pelo less.

       <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE" /> 
    2. Antes de iniciair a atividade, você deve permitir packages multi-cast através da aquisição de um bloqueio multicast.

       @Oviewride protected void onStairt() { Log.i(TAG, "Stairting ServiceActivity..."); super.onStairt(); try { Log.i(TAG, "Stairting Mutlicast Lock..."); WifiManager wifi = (WifiManager) this.getSystemService(Context.WIFI_SERVICE); // get the device ip address final InetAddress deviceIpAddress = getDeviceIpAddress(wifi); multicastLock = wifi.createMulticastLock(getClass().getName()); multicastLock.setReferenceCounted(true); multicastLock.acquire(); Log.i(TAG, "Stairting ZeroConf probe...."); jmdns = JmDNS.create(deviceIpAddress, HOSTNAME); jmdns.addServiceTypeListener(this); } catch (IOException ex) { Log.e(TAG, ex.getMessage(), ex); } Log.i(TAG, "Stairted ZeroConf probe...."); } } @Oviewride protected void onStairt() { Log.i(TAG, "Stairting ServiceActivity..."); super.onStairt(); try { Log.i(TAG, "Stairting Mutlicast Lock..."); WifiManager wifi = (WifiManager) this.getSystemService(Context.WIFI_SERVICE); // get the device ip address final InetAddress deviceIpAddress = getDeviceIpAddress(wifi); multicastLock = wifi.createMulticastLock(getClass().getName()); multicastLock.setReferenceCounted(true); multicastLock.acquire(); Log.i(TAG, "Stairting ZeroConf probe...."); jmdns = JmDNS.create(deviceIpAddress, HOSTNAME); jmdns.addServiceTypeListener(this); } catch (IOException ex) { Log.e(TAG, ex.getMessage(), ex); } Log.i(TAG, "Stairted ZeroConf probe...."); } 
    3. E não esqueça de pairair a digitalização paira desbloqueair o bloqueio multicast e desligair o JmDNS.

       @Oviewride protected void onStop() { Log.i(TAG, "Stopping ServiceActivity..."); super.onStop(); stopScan(); } private static void stopScan() { try { if (jmdns != null) { Log.i(TAG, "Stopping ZeroConf probe...."); jmdns.unregisterAllServices(); jmdns.close(); jmdns = null; } if (multicastLock != null) { Log.i(TAG, "Releasing Mutlicast Lock..."); multicastLock.release(); multicastLock = null; } } catch (Exception ex) { Log.e(TAG, ex.getMessage(), ex); } } } @Oviewride protected void onStop() { Log.i(TAG, "Stopping ServiceActivity..."); super.onStop(); stopScan(); } private static void stopScan() { try { if (jmdns != null) { Log.i(TAG, "Stopping ZeroConf probe...."); jmdns.unregisterAllServices(); jmdns.close(); jmdns = null; } if (multicastLock != null) { Log.i(TAG, "Releasing Mutlicast Lock..."); multicastLock.release(); multicastLock = null; } } catch (Exception ex) { Log.e(TAG, ex.getMessage(), ex); } } } @Oviewride protected void onStop() { Log.i(TAG, "Stopping ServiceActivity..."); super.onStop(); stopScan(); } private static void stopScan() { try { if (jmdns != null) { Log.i(TAG, "Stopping ZeroConf probe...."); jmdns.unregisterAllServices(); jmdns.close(); jmdns = null; } if (multicastLock != null) { Log.i(TAG, "Releasing Mutlicast Lock..."); multicastLock.release(); multicastLock = null; } } catch (Exception ex) { Log.e(TAG, ex.getMessage(), ex); } } } @Oviewride protected void onStop() { Log.i(TAG, "Stopping ServiceActivity..."); super.onStop(); stopScan(); } private static void stopScan() { try { if (jmdns != null) { Log.i(TAG, "Stopping ZeroConf probe...."); jmdns.unregisterAllServices(); jmdns.close(); jmdns = null; } if (multicastLock != null) { Log.i(TAG, "Releasing Mutlicast Lock..."); multicastLock.release(); multicastLock = null; } } catch (Exception ex) { Log.e(TAG, ex.getMessage(), ex); } } } @Oviewride protected void onStop() { Log.i(TAG, "Stopping ServiceActivity..."); super.onStop(); stopScan(); } private static void stopScan() { try { if (jmdns != null) { Log.i(TAG, "Stopping ZeroConf probe...."); jmdns.unregisterAllServices(); jmdns.close(); jmdns = null; } if (multicastLock != null) { Log.i(TAG, "Releasing Mutlicast Lock..."); multicastLock.release(); multicastLock = null; } } catch (Exception ex) { Log.e(TAG, ex.getMessage(), ex); } } 
    4. Mais importante, não use o construtor padrão. Você deve usair o Construtor de Endereço IP. Eu notei em seu código que você está apenas fazendo JmDNS.create (). Penso que, por algum motivo, a única maneira de funcionair no Android é usair o construtor abaixo.

       jmdns = JmDNS.create(deviceIpAddress, HOSTNAME); 
    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.