70 votes

Vérifiez la connexion internet d'INTENT

Y a-t-il un Android Intent ACTION_XXX qui me prévient lorsqu'une connexion Internet est disponible ?

Je veux instancier un BroadcastReceiver qui notifie mon application lorsqu'un utilisateur active la connexion Internet (par wifi, par GSM, etc.)

Quelqu'un peut-il m'aider ?

161voto

fedj Points 1949
<receiver android:name=".YOURRECEIVER">
   <intent-filter>
      <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
   </intent-filter>
</receiver>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

27 votes

Ce code ne fonctionnera pas pour les appareils Android 7+ en raison des éléments suivants ce

0 votes

Oui la réponse doit être mise à jour pour des références futures.

5 votes

@ShreyashSSarnayak C'est vrai. J'ajouterais qu'à partir d'Android N, vous devez enregistrer (et désenregistrer) votre récepteur de diffusion dans l'activité. Laisser cela dans le manifeste XML n'interférera pas avec la capacité de votre activité à recevoir le changement de connectivité sur Android N. Juste une clarification pour ceux qui se posent la question.

128voto

lujop Points 3066

La réponse acceptée est correcte. J'ajoute seulement le code du destinataire pour compléter :

public class NetworkStateReceiver extends BroadcastReceiver {
    public void onReceive(Context context, Intent intent) {
     Log.d("app","Network connectivity change");
     if(intent.getExtras()!=null) {
        NetworkInfo ni=(NetworkInfo) intent.getExtras().get(ConnectivityManager.EXTRA_NETWORK_INFO);
        if(ni!=null && ni.getState()==NetworkInfo.State.CONNECTED) {
            Log.i("app","Network "+ni.getTypeName()+" connected");
        } else if(intent.getBooleanExtra(ConnectivityManager.EXTRA_NO_CONNECTIVITY,Boolean.FALSE)) {
            Log.d("app","There's no network connectivity");
        }
   }
}

26 votes

BroadcastReceiver.onReceive est abstrait, donc vous ne pouvez pas appeler super.onReceive(context, intent); .

3 votes

Où avez-vous cherché (documentation) pour connaître le contenu du Bundle getExtras() ?

56voto

Felipe Lima Points 2346

Mise à jour de la réponse de @lujop :

public class NetworkStateReceiver extends BroadcastReceiver {
    private static final String TAG = "NetworkStateReceiver";

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

        Log.d(TAG, "Network connectivity change");

        if (intent.getExtras() != null) {
            final ConnectivityManager connectivityManager = (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);
            final NetworkInfo ni = connectivityManager.getActiveNetworkInfo();

            if (ni != null && ni.isConnectedOrConnecting()) {
                Log.i(TAG, "Network " + ni.getTypeName() + " connected");
            } else if (intent.getBooleanExtra(ConnectivityManager.EXTRA_NO_CONNECTIVITY, Boolean.FALSE)) {
                Log.d(TAG, "There's no network connectivity");
            }
        }
    }
}

5 votes

Merci pour votre réponse. Vous avez résolu le problème de la norme obsolète EXTRA_NETWORK_INFO . +1

2 votes

Bien que cela semble mieux fonctionner, je ne vois jamais le message "pas de connectivité réseau", même si je désactive le wifi et les données mobiles.

0 votes

Quel est le contexte ?

19voto

user2939690 Points 124

MonReceiver.java

public class MyReceiver extends BroadcastReceiver{

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

        if(isConnected(context)) Toast.makeText(context, "Connected.", Toast.LENGTH_LONG).show();
        else Toast.makeText(context, "Lost connect.", Toast.LENGTH_LONG).show();
    }

    public boolean isConnected(Context context) {
        ConnectivityManager cm =
                (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);

        NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
        boolean isConnected = activeNetwork != null &&
                              activeNetwork.isConnected();
        return isConnected;
    }
}

AndroidManifest.xml

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

UPDATE

Si votre application vise le niveau 26 de l'API ou plus, vous ne pouvez pas utiliser l'option manifeste pour déclarer un récepteur pour les diffusions implicites (diffusions qui ne ciblent pas spécifiquement votre application), à l'exception de quelques diffusions implicites de type qui sont exemptées de cette restriction. Dans la plupart des cas, vous pouvez utiliser des tâches planifiées à la place.

utilisation connection = MyReceiver()

// onCreate - onDestroy, onResume - onPause depends on you
override fun onStart() {
    super.onStart()
    registerReceiver(connection, IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION))
  }

override fun onStop() {
    super.onStop()
    // remember unregister to avoid leak
    unregisterReceiver(connection)
  }

MISE À JOUR 2

CONNECTIVITY_ACTION Cette constante a été supprimée au niveau 28 de l'API. Les applications doivent utiliser la constante plus polyvalente requestNetwork(NetworkRequest, PendingIntent) , registerNetworkCallback(NetworkRequest, PendingIntent) ou registerDefaultNetworkCallback(ConnectivityManager.NetworkCallback) pour obtenir des mises à jour plus rapides et plus détaillées sur les modifications du réseau qui les intéressent.

parce qu'il added in API level 22 Ainsi, le code ci-dessus fonctionnera correctement sur toutes les versions d'Android.

0 votes

Désolé monsieur, vous pouvez en voir plus ici ou sur Google : stackoverflow.com/questions/14701422/

0 votes

Bonjour, pouvez-vous répondre à cette question ? stackoverflow.com/questions/28294677/

0 votes

Vous pouvez faire un ping pour vérifier l'accès à l'internet, si le délai d'attente est dépassé c'est qu'il est connecté mais pas d'internet, vous avez raison car je vois que vous l'avez déjà fait.

17voto

hasan Points 4225

La partie manquante de toutes les réponses est un rappel pour s'inscrire à cette action :

IntentFilter filter = new IntentFilter();
filter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
registerReceiver(your_receiver, filter);

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