2011-06-03 3 views
1

J'ai besoin de savoir comment je peux détecter un commutateur dans les réseaux Wi-Fi, mais automatiquement ou manuellement, peu importe. Y a-t-il une sorte d'intention diffusée dans tout le système lorsqu'un interrupteur est détecté? Ou dois-je vérifier manuellement si un nouveau réseau est sélectionné en appelant une méthode sur un ConnectivityManager?Comment détecter les changements dans le réseau?

+2

duplication possible de [Détecter réseau 3G ou Wifi] (http://stackoverflow.com/questions/4503561/detect-3g-or-wifi-network-restoration) – Reno

+0

Cette question semble répondre à la question de savoir si un réseau est connecté ou déconnecté en général. J'ai besoin de savoir quand un changement entre les réseaux s'est produit. – ThaMe90

+0

Vous pouvez utiliser le même code. Si le type est Wifi, utilisez NetworkInfo pour obtenir les données [EXTRA_] (http://developer.android.com/reference/android/net/wifi/WifiManager.html). Par exemple BSSID devrait être différent pour les différents n/w WiFi – Reno

Répondre

7

A ce moment, j'ai résolu ce comme ça (ne sont pas totalement encore testé car je n'ai pas un second réseau disponible pour le moment):

J'ai étendu la classe BroadcastReceiver

private class NetworkSwitcher extends BroadcastReceiver { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     String action = intent.getAction(); 
     if (!action.equals(ConnectivityManager.CONNECTIVITY_ACTION)) { 
      return; 
     } 
     NetworkInfo networkInfo = 
      (NetworkInfo)intent.getParcelableExtra(ConnectivityManager.EXTRA_NETWORK_INFO); 
     if (networkInfo.isConnected()) { 
      if (networkInfo.getType() == ConnectivityManager.TYPE_WIFI) { 
       Log.d(TAG, "Network type: " + networkInfo.getTypeName() + 
         " Network subtype: " + networkInfo.getSubtypeName()); 
       getOwnIpAddress(); 
       mClient.updateUnicastSocket(mOwnAddress, mUnicastPort); 
      } 
     } 
     else { 
      Log.e(TAG, "Network connection lost"); 
     } 
    } 
} 

I enregistrer cette classe en tant que récepteur d'un filtre fixé à l'intention ConnectivityManager.CONNECTIVITY_ACTION (mise en onResume() et en la libérant dans onPause()). Cela devrait attraper n'importe quel commutateur de réseau Wi-Fi automatique. Le getOwnIpAddress récupère l'adresse IP du périphérique à partir du WifiManager.

J'ai également constaté que cela fonctionne quand je retourne à l'activité d'une autre activité.

+1

Je réalise que c'est l'acceptation (par l'OP) mais je ne pense pas que cela fonctionnera. Les docs recommandent d'utiliser WifiManager plutôt que ConnectivityManager pour le genre de chose que vous décrivez, donc vous utiliserez WifiManager.NETWORK_STATE_CHANGED_ACTION, mais je ne suis pas sûr que même cela ferait l'affaire: vous notifier quand votre client passe d'un BSSID à l'autre (si je comprends bien la question). – Tom

+0

Cela aurait pu être une meilleure solution. Bien que je ne travaille plus sur cette application (peut-être encore dans le futur). Si j'avais su du WifiManager, j'aurais essayé ça aussi. – ThaMe90

+0

'WifiManager.NETWORK_STATE_CHANGED_ACTION' fera l'affaire exactement comme @Tom dit et mentionné dans [Documentation] (http://developer.android.com/reference/android/net/wifi/WifiManager.html#NETWORK_STATE_CHANGED_ACTION) – Sdghasemi

Questions connexes