2017-07-18 6 views
0

Bonjour, je suis nouveau sur Android. J'ai créé une classe d'utilitaire NSD. Actuellement, il est impossible d'appeler la méthode DiscoveryListner. Toute aide sera grandeNSD Android - découverte du réseau

MainActivity

package com.example.android.implicitintents; 

import android.content.Intent; 
import android.os.AsyncTask; 
import android.os.Bundle; 
import android.support.v7.app.AppCompatActivity; 
import android.util.Log; 
import android.view.View; 
import android.widget.Toast; 

import com.example.android.implicitintents.Utils.NsdUtils; 

import java.net.URL; 

public class MainActivity extends AppCompatActivity { 

    private static final String TAG = "NsdChat"; 
    public static String URL_WEB; 
    NsdUtils mNsdUtils; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     NsdUtils mNsdUtils = new NsdUtils(this); 
     mNsdUtils.initializeNsd(); 
    } 

    public void onClickOpenWebpageButton(View view) { 
     String urlAsString = "http://192.168.10.1"; 
     openWebPage(urlAsString); 
    } 


    private void openWebPage(String url) { 
     Intent intent = new Intent(this, ConfigActivity.class); 
     intent.putExtra(URL_WEB, url); 
     Log.d(TAG, "Button Pressed"); 

     if (intent.resolveActivity(getPackageManager()) != null) { 
      startActivity(intent); 
     } 
    } 
} 

NSD Classe utilitaire

package com.example.android.implicitintents.Utils; 

import android.content.Context; 
import android.net.nsd.NsdServiceInfo; 
import android.net.nsd.NsdManager; 
import android.util.Log; 

public class NsdUtils { 
    Context mContext; 

    NsdManager mNsdManager; 
    NsdManager.ResolveListener mResolveListener; 
    NsdManager.DiscoveryListener mDiscoveryListener; 

    public static final String SERVICE_TYPE = "http"; 

    public static final String TAG = "NsdHelper"; 
    public String mServiceName = "Plug_Service"; 

    NsdServiceInfo mService; 

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

    public void initializeNsd() { 
     initializeResolveListener(); 
     initializeDiscoveryListener(); 
    } 

    public void initializeDiscoveryListener() { 
     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" + 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)){ 
        mNsdManager.resolveService(service, mResolveListener); 
       } 
      } 

      @Override 
      public void onServiceLost(NsdServiceInfo service) { 
       Log.e(TAG, "service lost" + service); 
       if (mService == service) { 
        mService = 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 void initializeResolveListener() { 
     mResolveListener = new NsdManager.ResolveListener() { 

      @Override 
      public void onResolveFailed(NsdServiceInfo serviceInfo, int errorCode) { 
       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; 
       } 
       mService = serviceInfo; 
      } 
     }; 
    } 
    public void discoverServices() { 
     mNsdManager.discoverServices(
       SERVICE_TYPE, NsdManager.PROTOCOL_DNS_SD, mDiscoveryListener); 
    } 
} 

J'ai essayé d'appeler le dicoverService en cas de bouton onclick en échec. Avons-nous besoin de créer une tâche asynchrone ou un nouveau thread?

Répondre

2

d'abord spécifier le type de réseau TCP que vous souhaitez trouver. Faites ensuite l'objet de la classe et appelez la fonction Intilization puis la fonction de découverte du NSD.

Cela devrait fonctionner correctement.

1

Il n'est pas nécessaire d'exécuter cette fonctionnalité dans un autre thread. Après une enquête fonctionnalité actuelle accident d'arrêt et de démarrage découverte, lorsque le changement String SERVICE_TYPE = "http"; à public static final String SERVICE_TYPE = "_name._tcp";

Vous pouvez découvrir tcp service et puis quand vous obtiendrez IP simplement se connecter au serveur web via http utiliser les adresse IP.