2012-10-09 24 views
27

Androidネイティブサービスディスカバリを使用してアプリケーションを実行しようとしていますが、アプリケーションを実行するときにネットワークからすべてのサービスが検出されないことがあります。私はhttps://github.com/joeluchoa/nsdのコードを4つの銀河系のネクサスを使って走らせていますが、それぞれが同時に異なる数のサービスを発見しています。Android NSDがすべてのサービスを検出しない

基本的に私はServerSocketを持つサービスを実行します。私はNsdManagerからメソッドdiscoverServicesを使用するサービスを発見するために

NsdServiceInfo serviceInfo = new NsdServiceInfo(); 

serviceInfo.setServiceName(Build.SERIAL + "-" + new Date().getTime()); 
serviceInfo.setServiceType(SERVICE_TYPE); 
serviceInfo.setPort(port); 

mNsdManager.registerService(serviceInfo, NsdManager.PROTOCOL_DNS_SD, 
     mRegistrationListener); 

ServerSocket server = new ServerSocket(0); 
Log.i(TAG, "IP " + server.getInetAddress() 
     + ", running on port " + server.getLocalPort()); 

Intent intent = new Intent(MySocket.this, 
     MyPresence.class); 
intent.putExtra("PORT", server.getLocalPort()); 
startService(intent); 

は、それから私は、NsdManagerからメソッドregisterServiceを使用して、それを公開します:

mNsdManager.discoverServices(SERVICE_TYPE, NsdManager.PROTOCOL_DNS_SD, 
     mDiscoveryListener); 

mDiscoveryListenerを次のように使用します。

mDiscoveryListener = new NsdManager.DiscoveryListener() { 

    @Override 
    public void onDiscoveryStarted(String regType) { 
     Log.d(TAG, "Service discovery started"); 
    } 

    @Override 
    public void onServiceFound(NsdServiceInfo service) { 
     Log.d(TAG, "Service discovery success"); 
     Log.d(TAG, String.format("%s %s %s %d", 
       service.getServiceName(), service.getServiceType(), 
       service.getHost(), service.getPort())); 
     if (!service.getServiceType().contains(SERVICE_TYPE)) { 
      Log.d(TAG, 
        "Unknown Service Type: " + service.getServiceType()); 
     } else if (service.getServiceName().equals(mServiceName)) { 
      Log.d(TAG, "Same machine: " + mServiceName); 
     } else { 
      mNsdManager.resolveService(service, mResolveListener); 
     } 
    } 

    @Override 
    public void onServiceLost(NsdServiceInfo service) { 
     Log.e(TAG, "service lost" + service); 
    } 

    @Override 
    public void onDiscoveryStopped(String serviceType) { 
     Log.i(TAG, serviceType + " Discovery stopped: " + serviceType); 
    } 

    @Override 
    public void onStartDiscoveryFailed(String serviceType, int errorCode) { 
     Log.e(TAG, serviceType + " Discovery failed: Error code:" 
       + errorCode); 
     mNsdManager.stopServiceDiscovery(this); 
    } 

    @Override 
    public void onStopDiscoveryFailed(String serviceType, int errorCode) { 
     Log.e(TAG, serviceType + " Discovery failed: Error code:" 
       + errorCode); 
     mNsdManager.stopServiceDiscovery(this); 
    } 
}; 

何か問題がありますか?誰かがこれに対する解決策または回避策を知っていますか?

+0

をホープだから、私は「ドンあなたにはまだ答えがありませんが、私はあなたのログステートメントであなたが解決していない情報を得ようとしていることに気づいています。 –

+2

すべての開発者は、try catchまたはすべての変数を出力してエラーを見つけるために、 –

+0

SERVICE_TYPEのサービス(この例ではhttp Webサーバー)を検出しているだけです。 –

答えて

1

私は同じ問題を抱えていました。使用するようにしてください:

1

私は恐れているサービスに見逃す原因となる実装のバグがあります。私は複数のAndroidデバイスとMacBookで数日間のテストを行いましたが、それは常に機能しません。 Androidバグトラッカーのバグレポートで私の発見を文書化しました: https://code.google.com/p/android/issues/detail?id=178080

1

私はAndroidのNSD実装全体がちょっと薄れていると思う傾向があります。私はライフサイクル(ソケットが開かれていない)を実証するだけのシンプルなアクティビティもあり、時には動作し、ときどき動作しない場合もあります。私は単にそれを取得しません。誰もがいくつかの洞察力があればここでの活動は次のとおりです。一方

https://github.com/mholzel/Dump/blob/master/NetworkServiceDiscoveryViaWifi.java

を、無線LANダイレクトベースNSDは私にとって非常に信頼性があると思われる:

https://github.com/mholzel/Dump/blob/master/NetworkServiceDiscoveryViaWifiDirect.java

注どちらもこれらのことをアクティビティにはリソースがありますので、適切な権限でマニフェストにアクティビティを追加してください。

0

答えが少し遅いかもしれませんが、アンドロイドが開発者サイトに提供しているNSDの良い解決策を発見しました。私はいくつかの変更を加え、それは完全に正常に動作します。

public class NsdClient { 
private Context mContext; 

private NsdManager mNsdManager; 
NsdManager.DiscoveryListener mDiscoveryListener; 

//To find all the available networks SERVICE_TYPE = "_services._dns-sd._udp" 
public static final String SERVICE_TYPE = "_hap._tcp."; 
public static final String TAG = "NsdClient"; 

private static ArrayList<NsdServiceInfo> ServicesAvailable = new ArrayList<>(); 

public NsdClient(Context context) { 
    mContext = context; 
    mNsdManager = (NsdManager) context.getSystemService(Context.NSD_SERVICE); 
} 

public void initializeNsd() { 
    initializeDiscoveryListener(); 
} 

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

     @Override 
     public void onDiscoveryStarted(String regType) { 
      Log.d(TAG, "Service discovery started " + regType); 
     } 

     @Override 
     public void onServiceFound(NsdServiceInfo service) { 
      Log.d(TAG, "Service discovery success " + service); 
      AVAILABLE_NETWORKS.add(service); 

      if (!service.getServiceType().equals(SERVICE_TYPE)) { 
       Log.d(TAG, "Unknown Service Type: " + service.getServiceType()); 
      } else if (service.getServiceName().equals(mServiceName)) { 
       Log.d(TAG, "Same Machine: " + mServiceName); 
      } else if (service.getServiceName().contains(mServiceName)) { 
       Log.d(TAG, "Resolving Services: " + service); 
       mNsdManager.resolveService(service, new initializeResolveListener()); 
      } 
     } 

     @Override 
     public void onServiceLost(NsdServiceInfo service) { 
      Log.e(TAG, "service lost" + service); 
      if (ServicesAvailable.equals(service)) { 
       ServicesAvailable = null; 
      } 
     } 

     @Override 
     public void onDiscoveryStopped(String serviceType) { 
      Log.i(TAG, "Discovery stopped: " + serviceType); 
     } 

     @Override 
     public void onStartDiscoveryFailed(String serviceType, int errorCode) { 
      Log.e(TAG, "Discovery failed: Error code:" + errorCode); 
      mNsdManager.stopServiceDiscovery(this); 
     } 

     @Override 
     public void onStopDiscoveryFailed(String serviceType, int errorCode) { 
      Log.e(TAG, "Discovery failed: Error code:" + errorCode); 
      mNsdManager.stopServiceDiscovery(this); 
     } 
    }; 
} 

public class initializeResolveListener implements NsdManager.ResolveListener { 

    @Override 
    public void onResolveFailed(NsdServiceInfo serviceInfo, int errorCode) { 
     Log.e(TAG, "Resolve failed " + errorCode); 
     switch (errorCode) { 
      case NsdManager.FAILURE_ALREADY_ACTIVE: 
       Log.e(TAG, "FAILURE ALREADY ACTIVE"); 
       mNsdManager.resolveService(serviceInfo, new initializeResolveListener()); 
       break; 
      case NsdManager.FAILURE_INTERNAL_ERROR: 
       Log.e(TAG, "FAILURE_INTERNAL_ERROR"); 
       break; 
      case NsdManager.FAILURE_MAX_LIMIT: 
       Log.e(TAG, "FAILURE_MAX_LIMIT"); 
       break; 
     } 
    } 

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


     if (serviceInfo.getServiceName().equals(mServiceName)) { 
      Log.d(TAG, "Same IP."); 
      return; 
     } 

    } 
} 

public void stopDiscovery() { 
    mNsdManager.stopServiceDiscovery(mDiscoveryListener); 
} 

public List<NsdServiceInfo> getChosenServiceInfo() { 
    return ServicesAvailable; 
} 

public void discoverServices() { 
    mNsdManager.discoverServices(
      SERVICE_TYPE, NsdManager.PROTOCOL_DNS_SD, mDiscoveryListener); 
} 
} 

が...それ、これは私が同じNSD情報とネットワーク内の2つのデバイスを持っている時にポップアップするようだNPEを修正しようとしているときに、私はあなたのポストアクロスカマー

関連する問題