2016-11-07 37 views
5

私のアプリがWiFiネットワークに接続しているときにネットワークサービスを実行中に問題が発生しました。 私はONL BroadcastServiceAndroidマシンがネットワークに接続されていません

public void registerService() { 
    NsdServiceInfo serviceInfo = new NsdServiceInfo(); 
    serviceInfo.setServiceName(mServiceName); 
    serviceInfo.setServiceType("_http._tcp."); 
    serviceInfo.setPort(openPort()); 

    mNsdManager = (NsdManager) mContext.getSystemService(Context.NSD_SERVICE); 

    mNsdManager.registerService(serviceInfo, NsdManager.PROTOCOL_DNS_SD, mRegistrationListener); 
} 

private int openPort() { 
    try{ 
     // Line that throws the exception 
     return new ServerSocket(0).getLocalPort(); 
    }catch (IOException ioe){ 
     Crashlytics.logException(ioe); 
     ioe.printStackTrace(); 
     return 0; 
    } 
} 

このブロードキャストレシーバー

@Override 
public void onReceive(Context context, Intent intent) { 

    String action = intent.getAction(); 

    if (WifiManager.NETWORK_STATE_CHANGED_ACTION.equals(action)) { 

     NetworkInfo networkInfo = intent.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO); 

     if (networkInfo.getState() == NetworkInfo.State.CONNECTED) { 
      welcomeService = new BroadcastService(context, "Welcome"); 
      Log.i(TAG, "onReceive: SUPPLICANT-STATE ---> Connected"); 
      //do something 
      if (!serviceRegistered) { 
       welcomeService.registerService(); 
       serviceRegistered = true; 
      } 
     } 

     if (networkInfo.getState() == NetworkInfo.State.DISCONNECTED) { 
      Log.i(TAG, "onReceive: SUPPLICANT-STATE ---> Disconnected"); 
      //do something 
      unRegisterService(); 
     } 
    } 

} 

public void unRegisterService() { 
    if (serviceRegistered && welcomeService != null) { 
     welcomeService.unregisterService(); 
     serviceRegistered = false; 

    } 
} 

BroadcastReceiver

怒鳴るopenPort()メソッドでは、次の例外

java.net.SocketException: socket failed: ENONET (Machine is not on the network)を取得していますメインアクティビティが表示されているときにyが実行されます。それは最初の実行で正常に動作しますが、私はWiFiネットワークを変更するとこれが起こります。ヘルプの世界は非常に高く評価されます。

+0

同じ問題に直面しています –

+0

@NinadKambliはネットワークにインターネット接続を持っていますか?私の問題はインターネットのないネットワークに接続したために発生し、アンドロイドは3/4G接続を使用することを選択しました。代わりに、私が通信しようとしているデバイスが届かないところに – Lonergan6275

+0

問題が解決しました。 Wi-Fiのネットがダウンしていてもユーザーがモバイルデータに接続しているときに無効にすることを忘れていたとしても、Wi-Fiでデータを送信するようにデバイスを制限していました。 –

答えて

0

サービスを開始し、ネットワークが変更されたり、ネットワークが停止したりすると、サービスを停止するサービスを使用します。また、最初にリリースを使用しているポートと同じポートをチェックしてください。そのポートを使用してください。onStartCommand()

@Override 
public void onReceive(Context context, Intent intent) { 
    Date now = new Date(); 
    Long time = now.getTime(); 
    String action = intent.getAction(); 



    NetworkInfo networkInfo = intent.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO); 

    if (networkInfo.getState() == NetworkInfo.State.CONNECTED) { 


    boolean check = isMyServiceRunning(context, 
    service.getName()); 
    if (check) { 
     Intent i = new Intent(sqlitewraper.context,service.class); 
     stopService(i); 
    } 
    else{ 
     Intent i = new Intent(sqlitewraper.context,service.class); 
     startservice(i); 

    } 

    } 

    if (networkInfo.getState() == NetworkInfo.State.DISCONNECTED) { 

    boolean check = isMyServiceRunning(context, 
    service.getName()); 
    if (check) { 
     Intent i = new Intent(sqlitewraper.context,service.class); 
     stopService(i); 
    } 
    } 


    private boolean isMyServiceRunning(Context context, String Myservice) { 
    ActivityManager manager = (ActivityManager) context 
    .getSystemService(Context.ACTIVITY_SERVICE); 
    for (RunningServiceInfo service : manager 
    .getRunningServices(Integer.MAX_VALUE)) { 
     if (Myservice.equals(service.service.getClassName())) { 

     return true; 
     } 
    } 
    return false; 
    } 
} 
+0

答えてくれてありがとうございますが、もっと詳しく説明したり、例を挙げてください。 – Lonergan6275

+0

これは、「新しいServerSocket(0).getLocalPort();」 – Lonergan6275

+0

の問題をどのように解決しているのですか?ネットワークが変更されている間にサービスを停止すると、サービスが開始されたときに割り当てられ、すでに割り当てられているリリースリソースが変更されます。 –

関連する問題