2017-09-30 3 views
0

J'ai une application multiplateforme Xamarin et je veux utiliser l'API NetworkServiceDiscovery d'Android.Comment implémenter correctement Xamarin NetworkServiceDiscovery via DependencyService?

J'ai essayé de le mettre en œuvre selon https://developer.android.com/training/connect-devices-wirelessly/nsd.html Maintenant, je ne sais pas si je l'ai fait tout droit, par exemple: La documentation android vous souhaite créer un RegistrationListener comme celui-ci:

Android:

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. 
     } 
    }; 
} 

Et je rebâti comme ça en 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. 
     } 
    } 

J'ai implémenté ResolveListener et DiscoveryListener de la même manière.

Alors je fait une classe d'assistance avec les fonctions que je veux appeler via 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); 
     } 
    } 

Et maintenant, quand je l'appelle RegisterService je reçois l'erreur suivante: RegisterService Error

Je ne sais pas où exactement je me suis trompé! Les erreurs je reçois pendant le débogage Xamarin Apps aussi ne pas aider beaucoup :(

Répondre

1

Hérite votre sous-classe RegistrationListener de Java.Lang.Object

Retirez la propriété Handle et les méthodes Dispose que celles mises en œuvre sont dans le Java.Lang.Object.

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

Une fois que vous faites cela, un ACW (Android Callable Wrapper) qui sera généré pour lier votre implémentation C# afin qu'il puisse être instancié à partir de Java VM