9

NsdManager.DiscoveryListener.onServiceFound() にパラメーターとして渡された NsdServiceInfo の mHost を取得しようとしていますが、null です。デバイス 1 がサーバーでデバイス 2 がクライアントである 2 つの Android デバイスがあります。

これは、デバイス1にサーバーを登録する方法です

public void registerService(int port, InetAddress myIp) {
    NsdServiceInfo serviceInfo  = new NsdServiceInfo();
    serviceInfo.setPort(port);
    serviceInfo.setServiceName(this.serviceName);
    serviceInfo.setServiceType(SERVICE_TYPE);
    serviceInfo.setHost(myIp);

    this.nsdManager.registerService(
            serviceInfo, NsdManager.PROTOCOL_DNS_SD, registrationListener);
}

そして、これが DiscoveryListener を初期化する方法です

public void initializeDiscoveryListener() {
    discoveryListener = new NsdManager.DiscoveryListener() {

        @Override
        public void onServiceFound(NsdServiceInfo service) {
            Log.d(TAG, "Service discovery success" + service);
            if (!service.getServiceType().equals(SERVICE_TYPE)) {
                Log.d(TAG, "Unknown Service Type: " + service.getServiceType());
            } else if (service.getHost() == myIp) {
                Log.d(TAG, "Same machine: " + service.getHost());
            } else if (service.getServiceName().contains(serviceName)){
                nsdManager.resolveService(service, resolveListener);
            }
        }
   ...
   }
}

しかし、service.getHost()は null を返します。
なにか提案を?

4

1 に答える 1

20

私はこの同じ問題に出くわしましたが、ネットワーク検出に関する Google のページの助けを借りてなんとか解決しました。

http://developer.android.com/training/connect-devices-wireless/nsd.html

問題は、サービスが検出されたときに接続情報がわからないことです。getHost() が機能する前に、最初に解決する必要があります。

あなたはすでに次の行を持っています:

    nsdManager.resolveService(service, resolveListener);

resolveListener 変数には、成功と失敗のコールバックが含まれています。接続情報が正常に決定されたときに getHost() を使用したい。Google の解決リスナーは次のとおりです。

    public void initializeResolveListener() {
        resolveListener = new NsdManager.ResolveListener() {

        @Override
        public void onResolveFailed(NsdServiceInfo serviceInfo, int errorCode) {
            // Called when the resolve fails.  Use the error code to debug.
            Log.e(TAG, "Resolve failed" + errorCode);
        }

        @Override
        public void onServiceResolved(NsdServiceInfo serviceInfo) {
            Log.e(TAG, "Resolve Succeeded. " + serviceInfo);

            if (serviceInfo.getServiceName().equals(mServiceName)) {
                Log.d(TAG, "Same IP.");
                return;
            }
            service = serviceInfo;
            int port = service.getPort();
            InetAddress host = service.getHost(); // getHost() will work now
        }
    };
}
于 2013-08-25T01:25:11.077 に答える