2017-07-18 67 views
0

您好,我是Android開發新手。我創建了一個NSD實用程序類。目前它無法調用DiscoveryListner方法。任何幫助將是巨大的NSD Android - 網絡發現

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工具類

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

我打過電話了dicoverService中的onclick按鈕事件失敗。我們是否需要創建一個異步任務或新線程?

回答

2

首先指定要查找的TCP網絡的類型。然後創建該類的對象並調用Intilization,然後調用NSD的發現函數。

它應該工作得很好。

1

沒有必要在另一個線程中運行此功能。 一些調查當前的功能停止崩潰之後,開始發現,當改變String SERVICE_TYPE = "http";public static final String SERVICE_TYPE = "_name._tcp";

你可以發現TCP服務,然後當你將獲得IP只是通過HTTP連接到Web服務器使用的IP地址。