安卓网络服务发现未触发监听器

4
我最近一直在尝试运用Android的网络服务发现功能。我已经让所有东西都可以正常工作了,但是我无论如何都不能使 NsdManager.RegistrationListener 得以调用。
我使用一个简单的回调函数初始化它,然后调用registerService,但却无法调用onServiceRegisteredonRegistrationFailed。如果可能的话,请查看下面的代码。我在服务内运行此注册操作,如果这很重要的话。
在日志中我看到了“正在注册服务”,但监听器中的回调从未被调用。
private NsdManager mNsdManager;
private NsdManager.RegistrationListener mRegistrationListener;  

@Override
public void onCreate() {
    super.onCreate();

    mNsdManager = (NsdManager) getApplicationContext().getSystemService(getApplicationContext().NSD_SERVICE);

    initializeRegistrationListener();
    startAdvertising();
}

public void initializeRegistrationListener() {
    mRegistrationListener = new NsdManager.RegistrationListener() {
        @Override
        public void onRegistrationFailed(NsdServiceInfo serviceInfo, int errorCode) {
            Log.i("myapp", "failed");
        }

        @Override
        public void onUnregistrationFailed(NsdServiceInfo serviceInfo, int errorCode) {

        }

        @Override
        public void onServiceRegistered(NsdServiceInfo serviceInfo) {
            Log.i("myapp", "success");
        }

        @Override
        public void onServiceUnregistered(NsdServiceInfo serviceInfo) {

        }
    };
}

public void startAdvertising() {
    NsdServiceInfo serviceInfo  = new NsdServiceInfo();
    serviceInfo.setPort(new ServerSocket(0).getLocalPort());
    serviceInfo.setServiceName("_myapp_one");
    serviceInfo.setServiceType("_http._tcp.");

    Log.i("myapp", "registering service");
    mNsdManager.registerService(serviceInfo, NsdManager.PROTOCOL_DNS_SD, mRegistrationListener);
}

我遇到了类似的问题,但对于我的代码,我不一定需要重新启动或卸载应用程序。我会不断重试,在几次运行后,服务注册成功(不知道背后的真正原因以及如何修复它)。我猜可能是Android操作系统在服务需要无限时间来注册时没有抛出超时异常的情况下,导致我既没有在onRegistrationFailed中收到错误,也没有调用onServiceRegistered。 - Saransh
1个回答

1
我遇到了同样的问题。 onServiceRegistered 或 onRegistrationFailed 回调从未发生。在我的情况下,我通过卸载我的应用程序并重新启动我正在使用的手机来解决它。
Android更改服务名称以解决冲突,因此我们需要更新最初请求的名称与Android实际使用的名称相匹配。我运行应用程序很多次,这可能是Android已经用完了服务名称的原因吗?

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接