146 votes

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

Je dois détecter si je dispose d'une connectivité réseau via 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 effectuer pour savoir qu'une connexion valide existe.

0 votes

J'ai trouvé ici des réponses à certaines parties de cette question : stackoverflow.com/questions/4238921/

1 votes

Mais la question se pose toujours de savoir QUAND vérifier ces conditions ?

1 votes

J'aimerais savoir s'il y a des émissions qui seront captées par un récepteur de radiodiffusion ?

129voto

jpm Points 1380

Vous pouvez enregistrer un BroadcastReceiver pour être averti lorsqu'une connexion WiFi est établie (ou si la connexion a changé).

Enregistrer le BroadcastReceiver :

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

Et ensuite, dans votre BroadcastReceiver faire quelque chose comme ça :

@Override
public void onReceive(Context context, Intent intent) {
    final String 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, voir la documentation de BroadcastReceiver y WifiManager

Bien entendu, vous devez d'abord vérifier si l'appareil est déjà connecté au réseau WiFi.

EDIT : Grâce à ban-geoengineering, voici une méthode pour vérifier si l'appareil 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();
}

1 votes

Pourquoi SUPPLICANT_CONECTION_CHANGE_ACTION ? Je pensais qu'il s'agissait d'une simple diffusion de changement de connexion (CONNECTION_CHANGE). Pourquoi SUPPLICANT ???? merci

2 votes

Hein ? Je ne vois pas d'action appelée connection_change... ? Je vois seulement wifi state changed mais cette action indique seulement si le wifi est activé ou non (ou en-/désactivation) pas s'il est connecté... est-ce que supplicant_connection_change_action ne fait pas ce dont vous avez besoin ?

9 votes

Pour moi, WifiManager.SUPPLICANT_CONNECTION_CHANGE_ACTION ne fonctionne pas dans le cas où la connexion à une station wifi connue a été établie / perdue. Mais WifiManager.NETWORK_STATE_CHANGED_ACTION fonctionne.

107voto

usman Points 546

Ce qui a le mieux fonctionné pour moi :

Manifeste Android

<receiver android:name="com.AEDesign.communication.WifiReceiver" >
   <intent-filter android:priority="100">
      <action android:name="android.net.wifi.STATE_CHANGE" />
   </intent-filter>
</receiver>

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. 

        // e.g. To check the Network Name or other info:
        WifiManager wifiManager = (WifiManager)context.getSystemService(Context.WIFI_SERVICE);
        WifiInfo wifiInfo = wifiManager.getConnectionInfo();
        String ssid = wifiInfo.getSSID();
      }
   }
}

Permissions

<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

1 votes

Je pense que c'est la meilleure réponse au changement d'état du wifi. Merci de votre compréhension.

4 votes

Pour référence future, cette action codée en dur est la suivante WifiManager.NETWORK_STATE_CHANGED_ACTION .

3 votes

If (info != null && info.isConnected()) = pas de spaghetti.

18voto

Yar Points 2233

Pour moi seulement WifiManager.NETWORK_STATE_CHANGED_ACTION œuvre.

Enregistrer un récepteur de radiodiffusion :

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

et recevoir :

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

    final String 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
    }      
}

1 votes

Pour moi aussi, seul WifiManager.NETWORK_STATE_CHANGED_ACTION a fonctionné, y a-t-il des explications sur la raison pour laquelle seul cela fonctionne ?

10voto

user1445716 Points 222

Vous peut démarrer une connexion wifi si vous donnez à l'utilisateur le choix d'ignorer le comportement normal qui consiste à demander à chaque fois.

J'ai choisi d'utiliser trois méthodes...

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

Cette fonction permet de vérifier rapidement s'il y a une connexion internet, que ce soit par Wifi ou par CellData. À partir de là, vous pouvez choisir l'action que vous souhaitez entreprendre. Il faut également vérifier si l'appareil est en mode avion.

Sur un autre sujet. J'ai mis une variable IpAddress à = " ". Et j'interroge jusqu'à ce que j'obtienne une adresse IP valide.

  WifiManager wifi;
  wifi = (WifiManager) this.getSystemService(Context.WIFI_SERVICE);
  WifiInfo wifiInfo = wifi.getConnectionInfo();
  int ipAddress = wifiInfo.getIpAddress();
  String ip = null;
  ip = String.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... Si elle n'est pas activée, activez-la (avec l'autorisation préalable de l'utilisateur)

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

1voto

Turnsole Points 1586

Vous voudrez utiliser le Gestionnaire de connectivité . Pour vérifier si le WiFi est spécifiquement activé, procédez comme suit :

    ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
    if( ! cm.getNetworkInfo(ConnectivityManager.TYPE_WIFI).isConnectedOrConnecting() ) {
        // do your stuff 
    }

Pour vous assurer qu'une connexion peut être établie, essayez de vous connecter à un site. Voici un exemple :

        URL url = new URL( websiteAddress );
        HttpURLConnection connection = (HttpURLConnection) url.openConnection();
        connection.setRequestProperty("User-Agent", "yourAgent");
        connection.setRequestProperty("Connection", "close");
        connection.setConnectTimeout(1000);
        connection.connect();

        if (connection.getResponseCode() == 200) {
            return true;
        }

Modification : en réponse à vos commentaires ultérieurs, la documentation du ConnectivityManager explique les diffusions qu'il envoie.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X