2013-05-21 36 views
7

例とtutorial on the developer pageを使用してNSDManagerを初めて実装するときに、アプリケーションが正常に検出を​​開始してデバイスを検出しました。Androidでネットワークサービスディスカバリを使用した場合の内部エラー

は、しかし、今では、プログラムが起動されると、いくつかの初期化した後、コードは以下の方法に入り、正常に実行

...壊れているようです。

public void discoverServices() { 
    Log.d(TAG, "Initializing discovery on NSD"); 
    mNsdManager.discoverServices(
      SERVICE_TYPE, NsdManager.PROTOCOL_DNS_SD, mDiscoveryListener); 
} 

対数メッセージが受信されました。良いしばらく(約5分と言う。)は、このプログラムから出力される:サービスからも

05-21 11:08:32.518: E/NsdCamera(12236): Discovery failed: Error code:0 
05-21 11:08:32.518: W/dalvikvm(12236): threadid=12: thread exiting with uncaught exception (group=0x40c9c930) 
05-21 11:08:32.518: E/AndroidRuntime(12236): FATAL EXCEPTION: NsdManager 
05-21 11:08:32.518: E/AndroidRuntime(12236): java.lang.NullPointerException 
05-21 11:08:32.518: E/AndroidRuntime(12236): at android.net.nsd.NsdManager$ServiceHandler.handleMessage(NsdManager.java:338) 
05-21 11:08:32.518: E/AndroidRuntime(12236): at android.os.Handler.dispatchMessage(Handler.java:99) 
05-21 11:08:32.518: E/AndroidRuntime(12236): at android.os.Looper.loop(Looper.java:137) 
05-21 11:08:32.518: E/AndroidRuntime(12236): at android.os.HandlerThread.run(HandlerThread.java:60) 

05-21 11:50:49.108: E/NativeDaemonConnector.ResponseQueue(8858): Timeout waiting for response 
05-21 11:50:49.108: E/mDnsConnector(8858): timed-out waiting for response to 10 mdnssd discover 6 _http._tcp. 
05-21 11:50:49.108: E/NsdService(8858): Failed to discoverServices com.android.server.NativeDaemonConnector$NativeDaemonFailureException: command '10 mdnssd discover 6 _http._tcp.' failed with 'null' 

は、エラーコード「0」としてNSDManager classに記述されています内部エラー。 私がした主な更新は、NsdCameraというヘルパークラスのコンテキストへのアクセスでした。

ヘルパークラスのコンストラクタ:

public NsdCamera(CameraChooseActivity context) { 
    mContext = context; 
    updateUI = new UpdateUI(); 
    mNsdManager = (NsdManager) context.getSystemService(Context.NSD_SERVICE); 
    mServiceName = new Vector<NsdServiceInfo>(); 

ヘルパークラスNSDの初期化: - >のonCreateがある

public void initializeNsd() { 
    initializeDiscoveryListener(); 
} 

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

     @Override 
     public void onDiscoveryStarted(String regType) { 
      Log.d(TAG, "Service discovery started"); 
     } 
     /** 
     * A name check to see if the DNS discovery was correct. Checks if it contains 
     * AXIS and has the desired MAC address-space 
     * @param hostname ,the inputted hostname from the discovery cycle 
     * @return true if it's an Axis camera. 
     */ 
     public boolean nameCheck(String hostname){ 
      return (hostname.contains("AXIS") && hostname.contains("00408C")); 

     } 
     @Override 
     public void onServiceFound(NsdServiceInfo service) { 
      Log.d(TAG, "Service discovery success: " + service.getServiceName()); 
      if (!service.getServiceType().equals(SERVICE_TYPE)) { 
       Log.d(TAG, "Unknown Service Type: " + service.getServiceType()); 
      } else if (nameCheck(service.getServiceName())){ 
       mServiceName.add(service); 
//     updateUI.execute(new BundleUI(mContext,service, null)); 
      } 
     } 

     @Override 
     public void onServiceLost(NsdServiceInfo service) { 
      Log.e(TAG, "service lost" + service); 
      if(mServiceName.remove(service)){ 
       //TODO 
       Log.e(TAG, "remove the view, service is lost"); 
      } 
     } 

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

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

CameraChooseActivity はここにいくつか、おそらく悪コードスニペットですヘルパークラスを呼び出す

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_camerachoose); 

    //Setup the animation for the text in the Relativelayout 
    mDescription = (TextSwitcher) findViewById(R.id.camera_add); 
    mDescription.setFactory(this); 
    mDescription.setInAnimation(AnimationUtils.loadAnimation(this, android.R.anim.fade_in)); 
    mDescription.setOutAnimation(AnimationUtils.loadAnimation(this, android.R.anim.fade_out)); 
    mDescription.setText(getText(R.string.camera_add)); 

    //Building alert dialog 
    mBuilder = new AlertDialog.Builder(this,AlertDialog.THEME_HOLO_DARK); 
    mBuilder.setMessage(R.string.dialog_about).setTitle(R.string.action_about); 
    mBuilder.setIcon(android.R.drawable.ic_dialog_info); 

    mLayout = (RelativeLayout) findViewById(R.id.layout_camerachoose); 

    //Initialize the NSD 
    mNSDHelper = new NsdCamera(this); 
    mNSDHelper.initializeNsd(); 

答えて

3

ベース、私はこれは、リスナーの寿命の問題であると仮定します。

システムNSDサービスに2つのリスナーを提供するため、1つはstartServiceDiscovery()用であり、もう1つはstopServiceDiscovery()です。システムがこれらのリスナーにアクセスするときに、これらのリスナーがまだ生きていることを確認する必要があります。

1つの事実は、startServiceDiscovery()が呼び出されてから2分後にonStartDiscoveryFailed()が呼び出されることです。これは、リスナーの有効期間と比較して長い時間にする必要があります。

リスナーがローカルオブジェクトで、startServiceDiscovery()を呼び出した後にリスナーが解放されると、NSDサービスがクラッシュする可能性があります。

ます。public void stopServiceDiscovery(NsdManager.DiscoveryListener リスナー)discoverServicesで開始

ストップサービスディスカバリ()。アクティブな サービスディスカバリは、 onDiscoveryStarted(String)でアプリケーションに通知され、アプリケーション がストップサービスディスカバリを呼び出すまでアクティブのままです。正常終了は に通知され、onDiscoveryStopped(String)が呼び出されます。

サービス検出の停止に失敗した場合、アプリケーションはonStopDiscoveryFailed(String、int)を通じて に通知されます。

パラメータlistener discoverServices(String、int、NsdManager.DiscoveryListener)に が渡されたリスナーオブジェクトである必要があります。 は、停止する必要のあるディスカバリーを識別し、 成功停止を通知します。

以下のスニペットでは、NsdManager APIを呼び出さないようにしてください。

@Override 
public void onStartDiscoveryFailed(String serviceType, int errorCode) { 
    Log.i(TAG, "onStartDiscoveryFailed : Error code:" + errorCode); 
} 

@Override 
public void onStopDiscoveryFailed(String serviceType, int errorCode) { 
    Log.i(TAG, "onStopDiscoveryFailed : Error code:" + errorCode); 
} 

Good Luck。

+0

ニースの答え!助けてくれてありがとう。 それは実際にはnullポインタを解決しました!しかし、「内部エラー」(エラーコード0)は依然として続きます.S – Mazze

3

単純なDUTの再起動が解決策であることが判明しました。エラーがかなり奇妙だと言わなければならない。 デーモンがクラッシュして再起動しなかったと思います。

(誰かが分析を投稿したり、より良いソリューションを持つことができる場合は、それを投稿してください)私の経験上

+0

DUTとは何ですか?同じエラーが発生していますが、デバイスが再起動します。 – fsschmitt

+0

DUT =テスト中のデバイス。 多くは問題を抱えている、いくつかのデバイスが原因デーモンのクラッシュに再起動し、しかし分は http://stackoverflow.com/questions/16907102/android-network-printers-discovery-nullpointerexception – Mazze

+0

本当にわからない...ありませんこれが正しい回答としてマークされている場合 –

関連する問題