2016-11-07 24 views
5

Mam problem z uruchomieniem usługi sieciowej, gdy moja aplikacja łączy się z siecią Wi-Fi. Otrzymuję następujący wyjątek,Urządzenie z systemem Android nie działa w sieci

java.net.SocketException: socket failed: ENONET (Machine is not on the network) w metodzie OpenPort() poniżej

BroadcastReceiver

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

    } 
} 

BroadcastService

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

to, że Broadcast Receiver onl y wyświetla się, gdy główne działanie jest wyświetlane. i działa dobrze po pierwszym uruchomieniu, ale kiedy zmieniam sieć WiFi, tak się dzieje. Pomóż światu być docenionym.

+0

z tym samym problemem –

+0

@NinadKambli powoduje, że sieć ma połączenie z Internetem. ponieważ mój problem został spowodowany przez połączenie się z siecią bez połączeń internetowych i androidowych, aby użyć połączenia 3/4G zamiast tego, w którym urządzenie, z którym próbuję się komunikować, jest nieosiągalne – Lonergan6275

+0

problem rozwiązany. Ograniczałem moje urządzenie do wysyłania danych przez Wi-Fi tylko wtedy, gdy sieć na Wi-Fi jest wyłączona i zapomniałem wyłączyć, gdy użytkownik jest podłączony do danych mobilnych. –

Odpowiedz

0

Skorzystaj z usługi, która uruchomi usługę i zatrzyma usługę, gdy sieć zostanie zmieniona lub zatrzyma sieć. Należy również sprawdzić ten sam port, który korzysta z wydania jako pierwszy, a następnie użyć tego portu. Bez względu na to, jakie zadanie chcesz wykonać w 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

Dziękuję za odpowiedź, ale czy mógłbyś wyjaśnić to bardziej szczegółowo lub podać przykład: – Lonergan6275

+0

Nie widzę, jak to rozwiązuje problem z 'nowym ServerSocket (0) .getLocalPort();' – Lonergan6275

+0

to z powodu zasobów wydania, które już są przydzielane, gdy usługa jest uruchomiona, jeśli usługa jest zatrzymana, podczas gdy sieć została zmieniona, a jej zasoby wydania zostały już przydzielone. –