Vérifiez la connexion internet INTENT

Existe-t-il une Intent ACTION_XXX Android Intent ACTION_XXX qui m’informe quand 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 pourrait-il m’aider?

           

    La réponse acceptée est correcte. Je n’ajoute que le code Récepteur pour l’achèvement:

     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"); } } } 

    Mise à jour de @lujop réponse:

     public class NetworkStateReceiver extends BroadcastReceiver { private static final Ssortingng 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"); } } } } 

    MyReceiver.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

             

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

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

    J’utilise la diffusion pour vérifier la connexion à chaque fois. Créez une classe pour les informations de connexion.

     import android.content.Context; import android.content.ContextWrapper; import android.net.ConnectivityManager; import android.net.NetworkInfo; public class ConnectivityStatus extends ContextWrapper{ public ConnectivityStatus(Context base) { super(base); } public static boolean isConnected(Context context){ ConnectivityManager manager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo connection = manager.getActiveNetworkInfo(); if (connection != null && connection.isConnectedOrConnecting()){ return true; } return false; } } 

    Appliquez du code dans votre activité:

      private BroadcastReceiver receiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { if(!ConnectivityStatus.isConnected(getContext())){ // no connection }else { // connected } } }; 

    Enregistrez la diffusion dans la méthode onCreate() votre activité:

     @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.your_layout); your_activity_context.registerReceiver(receiver, new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION)); .. ... .... } 

    N’oubliez pas de vous désinscrire / de vous inscrire au cycle d’activité:

     @Override protected void onResume() { super.onResume(); your_activity_context.registerReceiver(receiver, new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION)); } @Override protected void onPause() { super.onPause(); your_activity_context.unregisterReceiver(receiver); } 

    Réponse continue de miaou mwo

    vous pouvez activer / désactiver le récepteur en:

    activer

      ComponentName receiver = new ComponentName(MainActivity.this, MyReceiver.class); PackageManager pm = this.getPackageManager(); pm.setComponentEnabledSetting(receiver, PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP); Toast.makeText(this, "Disabled broadcst receiver", Toast.LENGTH_SHORT).show(); } 

    désactiver

     ComponentName receiver = new ComponentName(MainActivity.this, MyReceiver.class); PackageManager pm = this.getPackageManager(); pm.setComponentEnabledSetting(receiver, PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP); Toast.makeText(this, "Enabled broadcast receiver", Toast.LENGTH_SHORT).show(); } 

    où, le même peut être appelé dans un Intent ou dans onCreate

    Ce code fonctionnera (dans toutes les versions) car l’inscription du manifeste ne fonctionnera pas pour les périphériques 7+ (API 25 et versions ultérieures ) , voir ce lien .

     private void foo(){ registerReceiver(connectionBroadcastReceiver, new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION)); } private BroadcastReceiver connectionBroadcastReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { if (intent == null || intent.getExtras() == null) return; ConnectivityManager cm = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE); NetworkInfo networkInfo = cm.getActiveNetworkInfo(); if (networkInfo != null && networkInfo.getState() == NetworkInfo.State.CONNECTED) { // connected } } }; 

    NetworkInfo.isConnected() est une méthode peu fiable pour tester l’état de l’internet, elle retournera vrai quand il y a une connexion réseau même si elle n’a pas d’access à Internet (ex. Wifi sans internet). Une approche plus fiable consisterait à utiliser ping avec un BroadcastReceiver CONNECTIVITY_ACTION :

     private void registerInternetReceiver() { if (this.internetReceiver != null) return; this.internetReceiver = new BroadcastReceiver() { @Override public void onReceive (Context context, Intent intent) { if (isInternetAvailable()) Log.i ("Tag", "internet status online"); else Log.i ("Tag", "internet status offline"); } }; IntentFilter filter = new IntentFilter(); filter.addAction (ConnectivityManager.CONNECTIVITY_ACTION); registerReceiver (internetReceiver, filter); } private boolean isInternetAvailable() { try { return (Runtime.getRuntime().exec ("ping -c 1 google.com").waitFor() == 0); } catch (Exception ex) { ex.printStackTrace(); } return false; } 

    Je lirais les documents mis à jour pour nougat +, car l’intention est déconseillée en raison du nombre de périphériques, les informations réseau seules ne sont pas suffisantes. J’utiliserais les commandes et les vars du gestionnaire de connectivité (action de connectivité, ajout de variables) car la plupart ont changé au cours de la dernière année, et activent les données de cellule toujours actives, la journalisation détaillée et le transfert agressif. :

    https://developer.android.com/reference/android/net/ConnectivityManager.html#CONNECTIVITY_ACTION

    A partir d’Android 7 ++, la réponse de @ fedj ne fonctionnera pas mais vous pouvez enregistrer le récepteur de diffusion par programmation.

    Les applications ciblant Android 7.0 (API niveau 24) et versions ultérieures ne reçoivent pas de diffusion CONNECTIVITY_ACTION si elles déclarent le récepteur de diffusion dans leur manifeste. Les applications recevront toujours des diffusions CONNECTIVITY_ACTION si elles enregistrent leur BroadcastReceiver avec Context.registerReceiver () et que ce contexte est toujours valide.