2016-11-07 37 views
5

Sorunum var Uygulamam WiFi ağına bağlandığında bir şebeke servisi kullanmak. Ben haftaları BroadcastServiceAndroid Makine ağda değil

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

Bu Yayın Alıcısı

@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

feryat OpenPort() yönteminde, aşağıdaki istisna

java.net.SocketException: socket failed: ENONET (Machine is not on the network) alıyorum y ana aktivite gösterdiğinde çalışır. ve ilk seferde iyi çalışıyor ancak WiFi ağını değiştirdiğimde bu olur. Yardım dünyası büyük beğeni topluyor.

+0

aynı sorunla karşılaşıyor –

+0

@NinadKambli, ağa bir internet bağlantısına sahiptir. Sorun benim internet bağlantısı olmadan bir ağa bağlanarak ve android 3/4G bağlantısı yerine kullanmayı denediğim cihaz yerine iletişim kurmaya çalıştığım aygıtın – Lonergan6275

+0

sorununa erişilememesinden kaynaklanıyor. Cihazımı wifi üzerinden veri göndermesi için sınırlandırıyordum, ancak wifi'de ağ açık olsa bile ve kullanıcı mobil verilere bağlandığında devre dışı bırakmayı unuttum. –

cevap

0

Ağ değiştiğinde veya ağ durduğunda servis ve durdurma hizmetini başlatan Hizmeti kullanın. Ayrıca önce ve sonra bu bağlantı noktasını kullanan aynı bağlantı noktasını kontrol edin. onStartCommand() içinde istediğiniz görevi seçin.

@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

Cevabınız için teşekkür ederiz, ancak daha ayrıntılı olarak açıklayabilir veya bir örnek verebilir misiniz? – Lonergan6275

+0

Bu sorunun nasıl çözüleceğini bilmiyorum 'new ServerSocket (0) .getLocalPort();' – Lonergan6275

+0

, zaten yayın kaynakları olduğundan dolayı. Ağ değiştiğinde hizmetin kesilmesi durumunda hizmetin ne zaman başlatıldığını, daha sonra tahsis edilmiş olan serbest bırakma kaynaklarını ayırın. –