2017-09-30 6 views
0

私はXamarin Cross-Platform Appを持っていて、AndroidのNetworkServiceDiscovery APIを使いたいと思っています。DependencyService経由でXamarin NetworkServiceDiscoveryを正しく実装する方法は?

私は今、私は例えば、右のすべてをしたかはわからないhttps://developer.android.com/training/connect-devices-wirelessly/nsd.html に応じてそれを実装しようとした:アンドロイドドキュメントでは、このようなRegistrationListenerを作成したい:

アンドロイド:

public void initializeRegistrationListener() { 
    mRegistrationListener = new NsdManager.RegistrationListener() { 

     @Override 
     public void onServiceRegistered(NsdServiceInfo NsdServiceInfo) { 
      // Save the service name. Android may have changed it in order to 
      // resolve a conflict, so update the name you initially requested 
      // with the name Android actually used. 
      mServiceName = NsdServiceInfo.getServiceName(); 
     } 

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

     @Override 
     public void onServiceUnregistered(NsdServiceInfo arg0) { 
      // 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) { 
      // Unregistration failed. Put debugging code here to determine why. 
     } 
    }; 
} 

そして、私はC#でこのようにそれを再構築:

public class RegistrationListener : NsdManager.IRegistrationListener 
    { 
     public string serviceName; 

     public void Dispose() 
     { 
      throw new NotImplementedException(); 
     } 

     public IntPtr Handle { get; } 

     public void OnRegistrationFailed(NsdServiceInfo serviceInfo, NsdFailure errorCode) 
     { 
      // Registration failed! Put debugging code here to determine why. 
     } 

     public void OnServiceRegistered(NsdServiceInfo serviceInfo) 
     { 
      // Save the service name. Android may have changed it in order to 
      // resolve a conflict, so update the name you initially requested 
      // with the name Android actually used. 
      serviceName = serviceInfo.ServiceName; 
     } 

     public void OnServiceUnregistered(NsdServiceInfo serviceInfo) 
     { 
      // Service has been unregistered. This only happens when you call 
      // NsdManager.unregisterService() and pass in this listener. 
     } 

     public void OnUnregistrationFailed(NsdServiceInfo serviceInfo, NsdFailure errorCode) 
     { 
      // Unregistration failed. Put debugging code here to determine why. 
     } 
    } 

同じ方法でResolveListenerとDiscoveryListenerを実装しました。

その後、私は私がDependencyServices経由で呼び出したい関数とヘルパークラスを作った:

public class NsdHelper 
    { 
     public static readonly string SERVICE_TYPE = "chatTest._tcp"; 

     public DiscoveryListener discoveryListener; 
     public NsdManager nsdManager; 

     public NsdServiceInfo nsdServiceInfo; 
     public RegistrationListener registrationListener; 
     public ResolveListener resolveListener; 

     public string SERVICE_NAME { get; set; } 

     public void InitializeNsd() 
     { 
      resolveListener = new ResolveListener(); 
      discoveryListener = new DiscoveryListener(); 
      registrationListener = new RegistrationListener(); 

      resolveListener.ServiceName = SERVICE_NAME; 
      resolveListener.ServiceInfo = nsdServiceInfo; 
      discoveryListener.resolveListener = resolveListener; 
      discoveryListener.nsdManager = nsdManager; 
     } 

     public void RegisterService(string sessionName) 
     { 
      SERVICE_NAME = sessionName; 
      // Create the NsdServiceInfo object, and populate it. 
      nsdServiceInfo = new NsdServiceInfo 
      { 
       ServiceName = sessionName, 
       ServiceType = SERVICE_TYPE, 
       Port = GenerateFreePort() 
      }; 

      InitializeNsd(); 
      // The name is subject to change based on conflicts 
      // with other services advertised on the same network. 

      nsdManager = (NsdManager) Application.Context.GetSystemService(Context.NsdService); 

      nsdManager.RegisterService(
       nsdServiceInfo, NsdProtocol.DnsSd, registrationListener); 
     } 

     private int GenerateFreePort() 
     { 
      //setting the ServerSocket to 0 will generate the next free port 
      var serverSocket = new ServerSocket(0); 
      return serverSocket.LocalPort; 
     } 

     public void DiscoverServices() 
     { 
      nsdManager.DiscoverServices(
       SERVICE_TYPE, NsdProtocol.DnsSd, discoveryListener); 
     } 

     public void StopDiscovery() 
     { 
      nsdManager.StopServiceDiscovery(discoveryListener); 
     } 

     public NsdServiceInfo GetChosenServiceInfo() 
     { 
      return nsdServiceInfo; 
     } 

     public void TearDown() 
     { 
      nsdManager.UnregisterService(registrationListener); 
     } 
    } 

そして今、私は次のエラーを取得RegisterServiceを呼び出す:私は知りません RegisterService Error

を正確にどこが間違ってしまったのですか? Xamarinアプリのデバッグ中に私が手にエラーが発生した場合も、あまり役に立ちません:(

答えて

1

をものはJava.Lang.Objectに実装されているようHandle財産とのDisposeメソッドを削除Java.Lang.Object

からあなたRegistrationListenerサブクラスを継承。

public class RegistrationListener : Java.Lang.Object, NsdManager.IRegistrationListener 
{ 
    ~~~ 
} 

これを実行すると、Java VMからインスタンス化できるようにC#実装をバインドするために生成されるACW(Android Callable Wrapper)

関連する問題