web-dev-qa-db-fra.com

BroadcastReceiver lorsque l'état du réseau wifi ou 3G est modifié

J'ai une application qui met à jour la base de données chaque fois que le téléphone est connecté au WiFi. J'ai implémenté Service et BroadcastReceiver qui exécutera Service (il me dira quel réseau est utilisé), mais le problème est que je ne sais pas quoi ajouter dans le fichier manifest pour démarrer BroadcastReceiver lorsque l'état du réseau change il se connecte à une sorte de réseau

30
J1and1

Vous avez besoin 

<intent-filter>
<action Android:name="Android.net.wifi.WIFI_STATE_CHANGED"/>
<action Android:name="Android.net.wifi.STATE_CHANGE"/>
</intent-filter>

Dans votre balise receiver

Ou, si vous souhaitez davantage de contrôle, avant d’enregistrer BroadcastReceiver, configurez-le: 

final IntentFilter filters = new IntentFilter();
filters.addAction("Android.net.wifi.WIFI_STATE_CHANGED");
filters.addAction("Android.net.wifi.STATE_CHANGE");
super.registerReceiver(yourReceiver, filters);

WIFI_STATE_CHANGED

Broadcast <intent-action> indiquant que le Wi-Fi a été activé, désactivé, activé, désactivé ou inconnu. Un extra fournit cet état en tant que int. Un autre extra fournit l'état précédent, s'il est disponible.

STATE_CHANGE

Broadcast <intent-action> indiquant que l'état de la connectivité Wi-Fi a changé. Un extra fournit le nouvel état sous la forme d'un objet NetworkInfo. Si le nouvel état est CONNECTED, des extras supplémentaires peuvent fournir les identificateurs BSSID et WifiInfo du point d'accès. comme une chaîne

En outre, vous devez spécifier les autorisations appropriées dans la balise manifest:

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

Pour vérifier la connectivité, vous pouvez utiliser ConnectivityManager car il vous indique le type de connexion disponible. 

ConnectivityManager conMngr = (ConnectivityManager)this.getSystemService(this.CONNECTIVITY_SERVICE);
Android.net.NetworkInfo wifi = conMngr.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
Android.net.NetworkInfo mobile = conMngr.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
59
nullpotent

C’est ce que je fais pour être averti lorsque la connexion a changé .. Vous définissez une BroadCastReceiver pour recevoir la diffusion.

public class NetworkChangeReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        ConnectivityManager connMgr = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo wifi = connMgr.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
        NetworkInfo mobile = connMgr.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);

        boolean isConnected = wifi != null && wifi.isConnectedOrConnecting() ||
            mobile != null && mobile.isConnectedOrConnecting();
        if (isConnected) {
            Log.d("Network Available ", "YES");
        } else {
            Log.d("Network Available ", "NO");
        }
    }
}

Vous devez également définir la variable BroadcastReceiver dans votre fichier manifeste et filtrer par ConnectivityChange.

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

Source ici

5
Dantalian

Vous devez créer une BroadcastReceiver qui sera déclenchée lorsque l'état de la connectivité aura changé:

Ici Même question Comment vérifier périodiquement la connexion Internet dans l’ensemble de l’application?

1
Parag Chauhan

Pour compléter la réponse de @ Dantalian. À partir d'Android Nougat, vous ne devez pas déclarer votre récepteur sur votre manifeste, car il ne recevra pas la diffusion CONNECTIVITY_ACTION. Vous devriez plutôt enregistrer votre récepteur en utilisant la méthode Context.registerReceiver(Receiver, Intent)

Lien vers la source ici

1
Nicolás Carrasco

Déclarer le filtre d'intention à transmettre au destinataire de la diffusion

IntentFilter filter = new IntentFilter(WifiManager.WIFI_STATE_CHANGED_ACTION);
registerReceiver(mReceiver, filter);

Dans le récepteur de radiodiffusion, recherchez EXTRA_WIFI_STATE;

private BroadcastReceiver mReceiver = new BroadcastReceiver() {
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();

        switch (action)
        {
            case WifiManager.WIFI_STATE_CHANGED_ACTION:
                int extra = intent.getIntExtra(WifiManager.EXTRA_WIFI_STATE,0);
                if(extra==WifiManager.WIFI_STATE_ENABLED)
                {

                }//...else WIFI_STATE_DISABLED, WIFI_STATE_DISABLING, WIFI_STATE_ENABLING
                break;
        }

    }
};
0
N. Kyalo