web-dev-qa-db-fra.com

Écouteur Wifi Connect-Disconnect

Quel auditeur ma classe doit-elle implémenter pour vérifier automatiquement le code si le wifi se connecte/se déconnecte?

Je suis en mesure de vérifier manuellement la connexion/déconnexion wifi mais à chaque fois que je dois connecter/déconnecter le WIFI de Android settings puis exécuter mon programme pour le résultat.

Mon code actuel est aussi simple que:

WifiManager wifi = (WifiManager)getSystemService(Context.WIFI_SERVICE);
if (wifi.isWifiEnabled()==true)
{
    tv.setText("You are connected");
}
else
{
    tv.setText("You are NOT connected");
}
51
Neha

En fait, vous vérifiez si le Wi-Fi est activé , cela ne signifie pas nécessairement qu'il est connecté . Cela signifie simplement que le mode Wi-Fi sur le téléphone est activé et capable de se connecter aux réseaux Wi-Fi.

Voici comment j'écoute les connexions Wi-Fi réelles dans mon récepteur de diffusion:

public class WifiReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {     
        ConnectivityManager conMan = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); 
        NetworkInfo netInfo = conMan.getActiveNetworkInfo();
        if (netInfo != null && netInfo.getType() == ConnectivityManager.TYPE_WIFI) 
            Log.d("WifiReceiver", "Have Wifi Connection");
        else
            Log.d("WifiReceiver", "Don't have Wifi Connection");    
    }   
};

Pour accéder aux informations du réseau actif, vous devez ajouter l'autorisation d'utilisation suivante à votre AndroidManifest.xml:

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

Et le récepteur d'intention suivant (ou vous pouvez l'ajouter par programme ...)

<!-- Receive Wi-Fi connection state changes -->
<receiver Android:name=".WifiReceiver">
    <intent-filter>
        <action Android:name="Android.net.conn.CONNECTIVITY_CHANGE" />
    </intent-filter>
</receiver>

EDIT: Dans Lollipop, la planification des travaux peut être utile si vous cherchez à effectuer une action lorsque l'utilisateur se connecte à une connexion réseau non mesurée. Jetez un coup d'œil: http://developer.Android.com/about/versions/Android-5.0.html#Power


EDIT 2: Une autre considération est que ma réponse ne vérifie pas que vous avez une connexion à Internet . Vous pouvez être connecté à un réseau Wi-Fi qui vous oblige à vous connecter. Voici une vérification "IsOnline ()" utile: https://stackoverflow.com/a/27312494/1140744

75
warbi

Créez votre propre classe qui étend BroadcastReceiver ...

public class MyNetworkMonitor extends BroadcastReceiver {

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

        // Process the Intent here

    }
}

Dans AndroidManifest.xml

<receiver
    Android:name=".MyNetworkMonitor" >
        <intent-filter>
            <action Android:name="Android.net.wifi.STATE_CHANGE" />
            <action Android:name="Android.net.conn.CONNECTIVITY_CHANGE" />
        </intent-filter>
</receiver>

Voir WIFI_STATE_CHANGED_ACTION et CONNECTIVITY_ACTION pour une explication de l'utilisation de l'intention.

18
Squonk

Découvrez ces deux pages de javadoc: ConnectivityManagerWiFiManager

Notez que chacun définit des actions de diffusion. Si vous avez besoin d'en savoir plus sur l'enregistrement des récepteurs de diffusion, vérifiez ceci: Enregistrez par programmation un récepteur de diffusion

BroadcastReceiver receiver = new BroadcastReceiver() {
  @Override
  public void onReceive(Context context, Intent intent) {
    WifiManager wifi = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
    if (wifi.isWifiEnabled()) {
      tv.setText("You are connected");
    } else {
      tv.setText("You are NOT connected");
    }
  }
};

Et dans votre manifeste, vous pouvez faire quelque chose comme ça (si vous préférez NE PAS enregistrer le récepteur dans le code):

<application Android:icon="@drawable/icon" Android:label="@string/app_name">
    <receiver Android:name=".WiFiReceiver" Android:enabled="true">
        <intent-filter>
            <action Android:name="Android.net.ConnectivityManager.CONNECTIVITY_ACTION" />
        </intent-filter>
    </receiver>
</application>

MODIFIER:

Je dois ajouter qu'il serait préférable d'enregistrer ce récepteur de diffusion dans votre code plutôt que dans le manifeste si vous n'avez besoin de recevoir la diffusion que lorsque l'application est en cours d'exécution. En le spécifiant dans le manifeste, votre processus sera informé d'un changement de connexion même s'il n'était pas en cours d'exécution.

14
Tanner Perrien

Dans AndroidManifest.xml ajoutez l'autorisation suivante.

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

Créez une nouvelle classe Receiver.

public class ConnectionChangeReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        ConnectivityManager connectivityManager =
            (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo activeNetInfo = connectivityManager.getActiveNetworkInfo();

        if (activeNetInfo != null
            && activeNetInfo.getType() == ConnectivityManager.TYPE_WIFI) {
            Toast.makeText(context, "Wifi Connected!", Toast.LENGTH_SHORT).show();
        } else {
            Toast.makeText(context, "Wifi Not Connected!", Toast.LENGTH_SHORT).show();
        }
    }

Et ajoutez cette classe de récepteur au fichier AndroidManifest.xml.

<receiver Android:name="ConnectionChangeReceiver"
          Android:label="NetworkConnection">
  <intent-filter>
    <action Android:name="Android.net.conn.CONNECTIVITY_CHANGE"/>
  </intent-filter>
</receiver>
3
Aung Thuya

En réponse à sabsab. Pour me connecter au récepteur de diffusion Connectivity Change, j'ai utilisé la réponse de warbi et ajouté une classe avec des méthodes statiques.

public class WifiHelper
{
    private static boolean isConnectedToWifi;
    private static WifiConnectionChange sListener;

    public interface WifiConnectionChange {
        void wifiConnected(boolean connected);
    }

    /**
     * Only used by Connectivity_Change broadcast receiver
     * @param connected
     */
    public static void setWifiConnected(boolean connected) {
        isConnectedToWifi = connected;
        if (sListener!=null)
        {
            sListener.wifiConnected(connected);
            sListener = null;
        }
    }

    public static void setWifiListener(WifiConnectionChange listener) {
        sListener = listener;
    }
}

Ensuite, j'ai apporté des modifications à la classe de récepteur sur la première réponse ci-dessus.

public class ConnectivityReceiver extends BroadcastReceiver
{
@Override
public void onReceive(Context context, Intent intent)
{
    ConnectivityManager conMan = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo netInfo = conMan.getActiveNetworkInfo();
    if (netInfo != null && netInfo.getType() == ConnectivityManager.TYPE_WIFI)
    {
        Log.d("WifiReceiver", "Have Wifi Connection");
        WifiHelper.setWifiConnected(true);
    } else
    {
        Log.d("WifiReceiver", "Don't have Wifi Connection");
        WifiHelper.setWifiConnected(false);
    }

}
}

Enfin, dans votre activité, vous pouvez ajouter un écouteur pour utiliser ce rappel.

wifiManager = (WifiManager) getContext().getSystemService(Context.WIFI_SERVICE);
wasWifiEnabled = (wifiManager.getWifiState() == WifiManager.WIFI_STATE_ENABLED || wifiManager.getWifiState() == WifiManager.WIFI_STATE_ENABLING);
WifiHelper.setWifiListener(new WifiHelper.WifiConnectionChange()
    {
        @Override
        public void wifiConnected(boolean connected)
        {
            //Do logic here
        }
    });

Notez que l'écouteur est supprimé après le déclenchement du rappel, car il s'agit d'un écouteur statique. Quoi qu'il en soit, cette implémentation fonctionne pour moi et est un moyen de vous connecter à votre activité, ou n'importe où, c'est statique.

1
Danuofr