Comment détecter quand la connexion WIFI a été établie dans Android?

Je dois détecter quand j’ai une connectivité réseau sur WIFI. Quelle diffusion est envoyée pour établir qu’une connexion réseau valide a été établie. Je dois valider l’existence d’une connexion réseau valide pour HTTP. Que dois-je écouter et quels tests supplémentaires dois-je faire pour savoir qu’une connexion valide existe?

Vous pouvez enregistrer un BroadcastReceiver pour être averti lorsqu’une connexion WiFi est établie (ou si la connexion a été modifiée).

Enregistrez le BroadcastReceiver :

 IntentFilter intentFilter = new IntentFilter(); intentFilter.addAction(WifiManager.SUPPLICANT_CONNECTION_CHANGE_ACTION); registerReceiver(broadcastReceiver, intentFilter); 

Et puis dans votre BroadcastReceiver faire quelque chose comme ceci:

 @Override public void onReceive(Context context, Intent intent) { final Ssortingng action = intent.getAction(); if (action.equals(WifiManager.SUPPLICANT_CONNECTION_CHANGE_ACTION)) { if (intent.getBooleanExtra(WifiManager.EXTRA_SUPPLICANT_CONNECTED, false)){ //do stuff } else { // wifi connection was lost } } } 

Pour plus d’informations, consultez la documentation de BroadcastReceiver et WifiManager

Bien sûr, vous devriez vérifier si l’appareil est déjà connecté au WiFi avant cela.

EDIT: Merci à ban geoengineering, voici une méthode pour vérifier si le périphérique est déjà connecté:

  private boolean isConnectedViaWifi() { ConnectivityManager connectivityManager = (ConnectivityManager) appObj.getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo mWifi = connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI); return mWifi.isConnected(); } 

Le meilleur qui a fonctionné pour moi:

AndroidManifest

      

Classe BroadcastReceiver

 public class WifiReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { NetworkInfo info = intent.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO); if(info != null && info.isConnected()) { // Do your work. // eg To check the Network Name or other info: WifiManager wifiManager = (WifiManager)context.getSystemService(Context.WIFI_SERVICE); WifiInfo wifiInfo = wifiManager.getConnectionInfo(); Ssortingng ssid = wifiInfo.getSSID(); } } } 

Autorisations

   

Pour moi, seul WifiManager.NETWORK_STATE_CHANGED_ACTION fonctionne.

Enregistrer un récepteur de diffusion:

 IntentFilter intentFilter = new IntentFilter(); intentFilter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION); registerReceiver(broadcastReceiver, intentFilter); 

et recevez:

 @Override public void onReceive(Context context, Intent intent) { final Ssortingng action = intent.getAction(); if(action.equals(WifiManager.NETWORK_STATE_CHANGED_ACTION)){ NetworkInfo info = intent.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO); boolean connected = info.isConnected(); //call your method } } 

La réponse donnée par l’utilisateur @JPM et @usman est vraiment très utile. Cela fonctionne très bien, mais dans mon cas, cela arrive onReceive fois dans mon cas , donc mon code s’exécute plusieurs fois.

Je fais quelques modifications et fais selon mes exigences et maintenant il ne me rest qu’une seule fois

Voici la classe java pour Broadcast.

 public class WifiReceiver extends BroadcastReceiver { Ssortingng TAG = getClass().getSimpleName(); private Context mContext; @Override public void onReceive(Context context, Intent intent) { mContext = context; if (intent.getAction().equals(ConnectivityManager.CONNECTIVITY_ACTION)) { ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo networkInfo = cm.getActiveNetworkInfo(); if (networkInfo != null && networkInfo.getType() == ConnectivityManager.TYPE_WIFI && networkInfo.isConnected()) { // Wifi is connected WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE); WifiInfo wifiInfo = wifiManager.getConnectionInfo(); Ssortingng ssid = wifiInfo.getSSID(); Log.e(TAG, " -- Wifi connected --- " + " SSID " + ssid ); } } else if (intent.getAction().equalsIgnoreCase(WifiManager.WIFI_STATE_CHANGED_ACTION)) { int wifiState = intent.getIntExtra(WifiManager.EXTRA_WIFI_STATE, WifiManager.WIFI_STATE_UNKNOWN); if (wifiState == WifiManager.WIFI_STATE_DISABLED) { Log.e(TAG, " ----- Wifi Disconnected ----- "); } } } } 

Dans AndroidManifest

         

Vous pouvez démarrer une connexion wifi si vous donnez à l’utilisateur le choix de remplacer le comportement normal de demander à chaque fois.

Je choisis d’utiliser trois méthodes …

 public boolean isOnline() { ConnectivityManager connMgr = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo networkInfo = connMgr.getActiveNetworkInfo(); return (networkInfo != null && networkInfo.isConnected()); } 

C’est une vérification rapide s’il y a une connexion Internet Wifi ou CellData. De là, vous pouvez choisir l’action à entreprendre. Est-il en mode avion doit être vérifié également.

Sur un thread séparé. Je mets une variable IpAddress à = “” Et interroge jusqu’à ce que je dispose d’une adresse IP valide.

  WifiManager wifi; wifi = (WifiManager) this.getSystemService(Context.WIFI_SERVICE); WifiInfo wifiInfo = wifi.getConnectionInfo(); int ipAddress = wifiInfo.getIpAddress(); Ssortingng ip = null; ip = Ssortingng.format("%d.%d.%d.%d", (ipAddress & 0xff), (ipAddress >> 8 & 0xff), (ipAddress >> 16 & 0xff), (ipAddress >> 24 & 0xff)); Log.e(" >>IP number Begin ",ip); 

Un autre extrait de code … S’il n’est pas allumé (avec l’autorisation préalable des utilisateurs)

  if(wifi.isWifiEnabled()!=true)wifi.setWifiEnabled(true); 

Pour détecter l’état de la connexion WIFI, j’ai utilisé CONNECTIVITY_ACTION de la classe ConnectivityManager pour:

  IntentFilter filter=new IntentFilter(); filter.addAction(ConnectivityManager.CONNECTIVITY_ACTION); registerReceiver(receiver, filter); 

et de votre BroadCastReceiver:

  if (ConnectivityManager.CONNECTIVITY_ACTION.equals(action)) { int networkType = intent.getIntExtra( android.net.ConnectivityManager.EXTRA_NETWORK_TYPE, -1); if (ConnectivityManager.TYPE_WIFI == networkType) { NetworkInfo networkInfo = (NetworkInfo) intent .getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO); if (networkInfo != null) { if (networkInfo.isConnected()) { // TODO: wifi is connected } else { // TODO: wifi is not connected } } } } 

ps: ça marche bien pour moi 🙂

Ce code ne nécessite aucune autorisation. Il est limité aux modifications de l’état de la connectivité du réseau Wi-Fi (tout autre réseau n’est pas pris en compte). Le récepteur est publié de manière statique dans le fichier AndroidManifest.xml et n’a pas besoin d’être exporté car il sera appelé par la protected broadcast par le système, NETWORK_STATE_CHANGED_ACTION , à chaque changement d’état de connectivité réseau.

AndroidManifest:

        

Classe BroadcastReceiver:

 public class WifiReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { /* Tested (I didn't test with the WPS "Wi-Fi Protected Setup" standard): In API15 (ICE_CREAM_SANDWICH) this method is called when the new Wi-Fi network state is: DISCONNECTED, OBTAINING_IPADDR, CONNECTED or SCANNING In API19 (KITKAT) this method is called when the new Wi-Fi network state is: DISCONNECTED (twice), OBTAINING_IPADDR, VERIFYING_POOR_LINK, CAPTIVE_PORTAL_CHECK or CONNECTED (Those states can be obtained as NetworkInfo.DetailedState objects by calling the NetworkInfo object method: "networkInfo.getDetailedState()") */ /* * NetworkInfo object associated with the Wi-Fi network. * It won't be null when "android.net.wifi.STATE_CHANGE" action intent arrives. */ NetworkInfo networkInfo = intent.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO); if (networkInfo != null && networkInfo.isConnected()) { // TODO: Place the work here, like resortingeving the access point's SSID /* * WifiInfo object giving information about the access point we are connected to. * It shouldn't be null when the new Wi-Fi network state is CONNECTED, but it got * null sometimes when connecting to a "virtualized Wi-Fi router" in API15. */ WifiInfo wifiInfo = intent.getParcelableExtra(WifiManager.EXTRA_WIFI_INFO); Ssortingng ssid = wifiInfo.getSSID(); } } } 

Autorisations:

 None 

Voici un exemple de mon code qui prend en compte la préférence des utilisateurs d’autoriser uniquement les communications lorsqu’ils sont connectés au Wifi.

IntentService ce code depuis un IntentService avant d’essayer de télécharger des fichiers.

Notez que NetworkInfo sera null s’il n’y a pas de connexion réseau d’aucune sorte.

 private boolean canConnect() { ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); boolean canConnect = false; boolean wifiOnly = SharedPreferencesUtils.wifiOnly(); NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo(); if(networkInfo != null) { if(networkInfo.isConnected()) { if((networkInfo.getType() == ConnectivityManager.TYPE_WIFI) || (networkInfo.getType() != ConnectivityManager.TYPE_WIFI && !wifiOnly)) { canConnect = true; } } } return canConnect; } 

J’ai utilisé ce code:

 public class MainActivity extends Activity { . . . @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); . . . } @Override protected void onResume() { super.onResume(); IntentFilter intentFilter = new IntentFilter(); intentFilter.addAction(WifiManager.SUPPLICANT_CONNECTION_CHANGE_ACTION); registerReceiver(broadcastReceiver, intentFilter); } @Override protected void onPause() { super.onPause(); unregisterReceiver(broadcastReceiver); } private final BroadcastReceiver broadcastReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { final Ssortingng action = intent.getAction(); if (action.equals(WifiManager.SUPPLICANT_CONNECTION_CHANGE_ACTION)) { if (intent.getBooleanExtra(WifiManager.EXTRA_SUPPLICANT_CONNECTED, false)) { // wifi is enabled } else { // wifi is disabled } } } }; } 

J’ai deux méthodes pour détecter la connexion WIFI recevant le contexte de l’application:

1) mon ancienne méthode

 public boolean isConnectedWifi1(Context context) { try { ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo(); if (networkInfo != null) { NetworkInfo[] netInfo = connectivityManager.getAllNetworkInfo(); for (NetworkInfo ni : netInfo) { if ((ni.getTypeName().equalsIgnoreCase("WIFI")) && ni.isConnected()) { return true; } } } return false; } catch (Exception e) { Log.e(TAG, e.getMessage()); } return false; } 

2) ma nouvelle méthode (j’utilise actuellement cette méthode):

 public boolean isConnectedWifi(Context context) { ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo networkInfo = connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI); return networkInfo.isConnected(); } 

Pour tous ceux qui apprécient la diffusion de CONNECTIVITY_CHANGE , notez que ceci n’est plus déclenché lorsque l’application est en arrière-plan dans Android O.

https://developer.android.com/about/versions/o/background.html