0

Anyone face the same error and can resolve it?

java.lang.IllegalArgumentException: listener already in use at android.net.nsd.NsdManager.registerService(NsdManager.java:485)

NsdServiceInfo serviceInfo = new NsdServiceInfo();
serviceInfo.setServiceName(myServiceName);
serviceInfo.setServiceType(AppConfig.NSD_SERVICE_TYPE);
serviceInfo.setPort(AppConfig.VIDEO_CALL_PORT);
nsdManager.registerService(serviceInfo, NsdManager.PROTOCOL_DNS_SD, registrationListener);

...

NsdManager.RegistrationListener registrationListener = new NsdManager.RegistrationListener() {

        @Override
        public void onServiceRegistered(NsdServiceInfo serviceInfo) {
            try {
                // Android may have changed it in order to resolve a conflict, so update the name
                myServiceName = serviceInfo.getServiceName();
                nsdManager.discoverServices(AppConfig.NSD_SERVICE_TYPE, NsdManager.PROTOCOL_DNS_SD, discoveryListener);
            } catch (Exception e) {
                AppUtil.logErrorBaseOnMode(e);
            }
        }

        @Override
        public void onRegistrationFailed(NsdServiceInfo serviceInfo, int errorCode) {
            // todo
            // Registration failed!  Put debugging code here to determine why.
        }

        @Override
        public void onServiceUnregistered(NsdServiceInfo arg0) {
            // todo
            // Service has been unregistered.  This only happens when you call NsdManager.unregisterService() and pass in this listener.
        }

        @Override
        public void onUnregistrationFailed(NsdServiceInfo serviceInfo, int errorCode) {
            // todo
            // Un-registration failed.  Put debugging code here to determine why.
        }
    }
Amos
  • 2,222
  • 1
  • 26
  • 42
  • 1
    The exception message `listener already in use` means that you called `nsdManager.registerService()` and NEVER called `nsdManager.unregisterService(registrationListener)` later. – Onik Dec 14 '17 at 18:11

1 Answers1

1

I believe you simply have to use new listener for each registration. Every time you start service registration, you have to create new RegistrationListener object.

Like this:

nsdManager.registerService(serviceInfo, NsdManager.PROTOCOL_DNS_SD, new NsdManager.RegistrationListener() {...});

P.S. Same thing must be done for service resolution.

See more info here: docs

Community
  • 1
  • 1
Pavel S.
  • 302
  • 1
  • 2
  • 10