ConnectivityManager getNetworkInfo (int) obsolète

144

En utilisant compileSdkVersion 23 , mais en essayant de prendre en charge aussi loin que 9.

getNetworkInfo(int)était obsolète dans 23. La suggestion était d'utiliser getAllNetworks()etgetNetworkInfo(Network) place. Cependant, les deux nécessitent un minimum d'API 21.

Y a-t-il une classe que nous pouvons utiliser dans le package de support qui peut vous aider?

Je sais qu'une solution a été proposée auparavant , mais le défi de mes exigences minimales d'API de 9 pose un problème.

kyleED
la source
vous pouvez vérifier la version de construction au moment de l'exécution et utiliser la méthode appropriée
stinepike
1
Cela lancera-t-il toujours un avertissement obsolète?
kyleED
Veuillez consulter ma classe ConnectivityObserver qui encapsule les méthodes API ci-dessous et au-dessus d'Android Nougat.
JJD

Réponses:

166

Vous pouvez utiliser:

getActiveNetworkInfo ();

ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
if (activeNetwork != null) { 
    // connected to the internet
    if (activeNetwork.getType() == ConnectivityManager.TYPE_WIFI) {
        // connected to wifi
    } else if (activeNetwork.getType() == ConnectivityManager.TYPE_MOBILE) {
        // connected to mobile data
    }
} else {
    // not connected to the internet
}

Ou dans un boîtier de commutation

ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
if (activeNetwork != null) { 
    // connected to the internet
    switch (activeNetwork.getType()) {
        case ConnectivityManager.TYPE_WIFI:
            // connected to wifi
            break;
        case ConnectivityManager.TYPE_MOBILE:
            // connected to mobile data
            break;
        default:
            break;
    }
} else {
    // not connected to the internet
}
Pain au fromage
la source
1
@ShirishHerwade - Oui, le récepteur de diffusion n'est pas nécessaire dans ce cas. getActiveNetworkInfo () peut être placé dans sa propre méthode à condition qu'une référence de contexte soit incluse.
Pain au fromage
1
@TheIT - Oui, le doc dit "Vous devriez toujours vérifier isConnected () avant de lancer le trafic réseau". Cette solution n'initie pas de trafic et fournit uniquement une solution à l'appel obsolète getNetworkInfo ().
Pain au fromage
7
Depuis Android 9, SDK 28 est désormais obsolète.
Zbarcea Christian
32
activeNetwork.getType()est obsolète et ConnectivityManager.TYPE_WIFIobsolète
Godwin
7
Le remplacement est maintenantcm.getNetworkCapabilities(cm.activeNetwork).hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)
tmm1
63

Quant à octobre 2018, la réponse acceptée est obsolète.

getType(), et les types eux-mêmes, sont désormais obsolètes au niveau de l'API 28. De Javadoc:

Les appelants doivent passer à la vérification de NetworkCapabilities # hasTransport à la place avec l'une des constantes NetworkCapabilities # TRANSPORT *

Pour utiliser NetworkCapabilities , vous devez transmettre une Networkinstance à la getNetworkCapabilities()méthode. Pour obtenir cette instance, vous devez appelergetActiveNetwork() ce qui a été ajouté au niveau d'API 23.

Je pense donc que pour l'instant, la bonne façon de vérifier en toute sécurité si vous êtes connecté au Wi-Fi ou au réseau cellulaire est:

public static boolean isNetworkConnected() {
    final ConnectivityManager cm = (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);

    if (cm != null) {
        if (Build.VERSION.SDK_INT < 23) {
            final NetworkInfo ni = cm.getActiveNetworkInfo();

            if (ni != null) {
                return (ni.isConnected() && (ni.getType() == ConnectivityManager.TYPE_WIFI || ni.getType() == ConnectivityManager.TYPE_MOBILE));
            }
        } else {
            final Network n = cm.getActiveNetwork();

            if (n != null) {
                final NetworkCapabilities nc = cm.getNetworkCapabilities(n);

                return (nc.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR) || nc.hasTransport(NetworkCapabilities.TRANSPORT_WIFI));
            }
        } 
    }

    return false; 
}

Vous pouvez également rechercher d'autres types de TRANSPORT, que vous pouvez trouver ici .

Remarque importante: si vous êtes connecté au Wi-Fi et à un VPN, votre état actuel pourrait êtreTRANSPORT_VPN , vous voudrez peut-être le vérifier également.

N'oubliez pas d'ajouter l'autorisation suivante à votre fichier AndroidManifest:

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
Pavelnazimok
la source
HasTransport (NetworkCapabilities.TRANSPORT_WIFI) est-il équivalent à ni.isConnected () && (ni.getType () == ConnnectivityManager.TYPE_WIFI)? Je veux dire, la fonction hasTransport () vérifie également si l'appareil est connecté ou tente de se connecter?
Biscuit
Encore une fois, NetworkInfoest amorti, vous ne pouvez plus utiliser NetWorkInfo, alors en quoi cela constitue-t-il une alternative?
Prescott Chartier
@PrescottChartier cet extrait de code accède uniquement à NetworkInfo sur les appareils SDK <23
Tom
59

Mise à jour de février 2020:

La réponse acceptée est à nouveau obsolète dans 28 (Android P), mais sa méthode de remplacement ne fonctionne que sur23 (Android M) . Pour prendre en charge les appareils plus anciens, j'ai écrit une fonction d'assistance dans.

Comment utiliser:

int type = getConnectionType(getApplicationContext());

Il renvoie un int, vous pouvez le changer enumdans votre code:

0: Pas d'Internet disponible (peut-être en mode avion, ou en train de rejoindre un wi-fi).

1: Cellulaire (données mobiles, 3G / 4G / LTE peu importe).

2: Wi-fi.

3: VPN

Vous pouvez copier la version Kotlin ou Java de la fonction d'assistance.

Kotlin:

@IntRange(from = 0, to = 3)
fun getConnectionType(context: Context): Int {
    var result = 0 // Returns connection type. 0: none; 1: mobile data; 2: wifi
    val cm = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager?
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        cm?.run {
            cm.getNetworkCapabilities(cm.activeNetwork)?.run {
                if (hasTransport(NetworkCapabilities.TRANSPORT_WIFI)) {
                    result = 2
                } else if (hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)) {
                    result = 1
                } else if (hasTransport(NetworkCapabilities.TRANSPORT_VPN)){
                    result = 3
                }
            }
        }
    } else {
        cm?.run {
            cm.activeNetworkInfo?.run {
                if (type == ConnectivityManager.TYPE_WIFI) {
                    result = 2
                } else if (type == ConnectivityManager.TYPE_MOBILE) {
                    result = 1
                } else if(type == ConnectivityManager.TYPE_VPN) {
                    result = 3
                }
            }
        }
    }
    return result
}

Java:

@IntRange(from = 0, to = 3)
public static int getConnectionType(Context context) {
    int result = 0; // Returns connection type. 0: none; 1: mobile data; 2: wifi
    ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        if (cm != null) {
            NetworkCapabilities capabilities = cm.getNetworkCapabilities(cm.getActiveNetwork());
            if (capabilities != null) {
                if (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)) {
                    result = 2;
                } else if (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)) {
                    result = 1;
                } else if (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_VPN)) {
                    result = 3;
                }
            }
        }
    } else {
        if (cm != null) {
            NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
            if (activeNetwork != null) {
                // connected to the internet
                if (activeNetwork.getType() == ConnectivityManager.TYPE_WIFI) {
                    result = 2;
                } else if (activeNetwork.getType() == ConnectivityManager.TYPE_MOBILE) {
                    result = 1;
                } else if (activeNetwork.getType() == ConnectivityManager.TYPE_VPN) {
                    result = 3;
                }
            }
        }
    }
    return result;
}
user1032613
la source
2
Comme vous avez 2 résultats possibles, il vaut mieux utiliser un booléen au lieu de renvoyer un entier ...
Christian
3
@Christian Comme expliqué dans la section jaune, cette fonction d'assistance retourne 3 états possibles: No Internet, Cellularet Wi-Fi. Si vous ne vous souciez pas du type de connexion, n'hésitez pas à modifier le code pour l'adapter à votre application.
user1032613
1
qu'en est-il du commentaire de la solution ci-dessus "si vous êtes connecté au Wi-Fi et à un VPN, votre état actuel pourrait être TRANSPORT_VPN, vous voudrez peut-être également le vérifier."?
David le
1
@Lukas vous devez faire attention si vous utilisez une Booleanclasse wrapper au lieu de booleanlaquelle est primitive. Dans la déclaration if, vous devrez ajouter un chèque null. Et si demain un autre nouveau mode de transport dans NetworkCapabilities est introduit ... donc utiliser un entier pour le branchement aidera et vous pouvez également opter pour des cas de commutation.
Shadow Droid
3
Je suis fatigué de ce cycle de dépréciation constant
Segun Wahaab
16

Réponse mise à jour (19: 07: 2018):

Cette méthode vous aidera à vérifier si la connexion Internet est disponible.

public static boolean isNetworkAvailable(Context context) {
    ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);

    if (connectivityManager != null) {
        NetworkInfo activeNetwork = connectivityManager.getActiveNetworkInfo();
        return (activeNetwork != null && activeNetwork.isConnectedOrConnecting());
    } else {
        return false;
    }
}

Ancienne réponse:

Pour une meilleure pratique de réutilisation du code, improvisez la réponse Cheese Bread.

public static boolean isNetworkAvailable(Context context) {
    int[] networkTypes = {ConnectivityManager.TYPE_MOBILE,
            ConnectivityManager.TYPE_WIFI};
    try {
        ConnectivityManager connectivityManager =
                (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        for (int networkType : networkTypes) {
            NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();
            if (activeNetworkInfo != null &&
                    activeNetworkInfo.getType() == networkType)
                return true;
        }
    } catch (Exception e) {
        return false;
    }
    return false;
}

Le code peut être placé dans la classe Util et peut être utilisé pour vérifier si le téléphone est connecté à Internet via Wifi ou Internet mobile à partir de n'importe quelle partie de votre application.

Nishanth Sreedhara
la source
3
Je suggérerais de déplacer l'obtention du réseau actif en dehors de la boucle for.
shtolik
20
activeNetwork.isConnectedOrConnecting()est maintenant obsolète
MHSFisher
1
Je change activeNetwork.isConnectedOrConnecting () en activeNetwork.isConnected
Murillo Comino
NetworkInfo est désormais obsolète. Besoin de mettre à jour encore une fois!
SMBiggs
13

La réponse acceptée est obsolète dans la version 28, voici donc la solution que j'utilise dans mon projet.

Renvoie le type de connexion. faux: pas de connexion Internet; vrai: données mobiles || Wifi

public static boolean isNetworkConnected(Context context) { 
    boolean result = false; 
    ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        if (cm != null) {
            NetworkCapabilities capabilities = cm.getNetworkCapabilities(cm.getActiveNetwork());
            if (capabilities != null) {
                if (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)) {
                    result = true;
                } else if (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)) {
                    result = true;
                }
            }
        }
    } else {
        if (cm != null) {
            NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
            if (activeNetwork != null) {
                // connected to the internet
                if (activeNetwork.getType() == ConnectivityManager.TYPE_WIFI) {
                    result = true;
                } else if (activeNetwork.getType() == ConnectivityManager.TYPE_MOBILE) {
                    result = true;
                }
            }
        }
    }
    return result;
}
Rahul
la source
2
activeNetwork.getType () est également obsolète. Vous pouvez utiliser activeNetwork.isConnected ();
Aman Verma
11

Il existe une mise à jour de cette réponse à partir de mars 2020 qui prend en charge l'API.15 via l'API.29, vous pouvez la trouver en suivant la réponse d'origine

Réponse Février 2019

Pour vérifier si vous êtes en ligne:

boolean isOnline() {
    // Checking internet connectivity
    ConnectivityManager connectivityMgr = (ConnectivityManager) this.getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo activeNetwork = null;
    if (connectivityMgr != null) {
        activeNetwork = connectivityMgr.getActiveNetworkInfo();
    }
    return activeNetwork != null;
}

Pour obtenir le type de connectivité Internet avant / après Android M

void internetType() {
    // Checking internet connectivity
    ConnectivityManager connectivityMgr = (ConnectivityManager) this.getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo activeNetwork = null;
    if (connectivityMgr != null) {
        activeNetwork = connectivityMgr.getActiveNetworkInfo();
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            NetworkCapabilities nc = connectivityMgr.getNetworkCapabilities(connectivityMgr.getActiveNetwork());
            if (nc.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)) {
                // connected to mobile data
            } else if (nc.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)) {
                // connected to wifi
            }
        } else {
            if (activeNetwork.getType() == ConnectivityManager.TYPE_WIFI) {
                // connected to wifi
            } else if (activeNetwork.getType() == ConnectivityManager.TYPE_MOBILE) {
                // connected to mobile data
            }
        }
    }
}

Tous les cas nécessitent une autorisation pour accéder à l'état du réseau

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

Mise à jour mars 2020

Comme il NetworkInfoest obsolète et à partir de l'API 29, nous devons désormais l'utiliser ConnectivityManager.NetworkCallbackavec son changement d'état du réseau onAvailable()etonLost() rappels.

Usage:

  • Vous pouvez soit utiliser cette bibliothèque , soit utiliser directement la classe d'utilitaire ci-dessous qui fait partie de cette bibliothèque.

Caractéristiques

  • C'est LifeCycle conscient en mettant en œuvre LifecycleObserverpour éviter les fuites de mémoire en effectuant un certain nettoyage dansonDestroy() méthode.
  • Il prend en charge de l'API 15 (Ice Cream Sandwich) à l'API 29 (Android Q)
  • Pour les API antérieures à l'API 21, il utilise un contexte BoradcastReceiveret NetworkInfo, et utiliseConnectivityManager.NetworkCallback pour l'API 21 et supérieur.
  • Lorsque les réseaux WiFi et cellulaire sont activés, l'auditeur de connectivité ne s'interrompt pas lorsque le WiFi est déconnecté lors de la transition vers le réseau cellulaire.
  • Lorsque le réseau cellulaire est activé, l'auditeur de connectivité ne s'interrompra pas lorsque le WiFi est connecté et qu'il s'agit du réseau actif (car c'est le réseau préféré).
  • Si vous comptez utiliser la bibliothèque, inutile d'inclure cette autorisation android.permission.ACCESS_NETWORK_STATE; mais vous devez l'inclure si vous comptez utiliser la classe utilitaire.

Capacités

  • Obtenez l'état actuel de la connectivité (en ligne / hors ligne).
  • Vérification / écoute continue de la connexion Internet et déclenchement d'un rappel lorsque l'appareil est hors ligne ou en ligne.
  • Obtenez le type de connexion Internet active (WiFi ou Cellulaire).
  • Obtenez le type de tous les réseaux disponibles (WiFi ou Cellulaire). >> Uniquement pris en charge sur l'API 21+
  • Obtenez le nombre de tous les réseaux disponibles >> Uniquement pris en charge sur l'API 21+
@RequiresApi(api = Build.VERSION_CODES.ICE_CREAM_SANDWICH_MR1)
public class ConnectionUtil implements LifecycleObserver {

    private static final String TAG = "LOG_TAG";
    private ConnectivityManager mConnectivityMgr;
    private Context mContext;
    private NetworkStateReceiver mNetworkStateReceiver;

    /*
     * boolean indicates if my device is connected to the internet or not
     * */
    private boolean mIsConnected = false;
    private ConnectionMonitor mConnectionMonitor;


    /**
     * Indicates there is no available network.
     */
    private static final int NO_NETWORK_AVAILABLE = -1;


    /**
     * Indicates this network uses a Cellular transport.
     */
    public static final int TRANSPORT_CELLULAR = 0;


    /**
     * Indicates this network uses a Wi-Fi transport.
     */
    public static final int TRANSPORT_WIFI = 1;


    public interface ConnectionStateListener {
        void onAvailable(boolean isAvailable);
    }


    public ConnectionUtil(Context context) {
        mContext = context;
        mConnectivityMgr = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        ((AppCompatActivity) mContext).getLifecycle().addObserver(this);

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            mConnectionMonitor = new ConnectionMonitor();
            NetworkRequest networkRequest = new NetworkRequest.Builder()
                    .addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR)
                    .addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
                    .build();
            mConnectivityMgr.registerNetworkCallback(networkRequest, mConnectionMonitor);
        }

    }


    /**
     * Returns true if connected to the internet, and false otherwise
     *
     * <p>
     * NetworkInfo is deprecated in API 29
     * https://developer.android.com/reference/android/net/NetworkInfo
     * <p>
     * getActiveNetworkInfo() is deprecated in API 29
     * https://developer.android.com/reference/android/net/ConnectivityManager#getActiveNetworkInfo()
     * <p>
     * getNetworkInfo(int) is deprecated as of API 23
     * https://developer.android.com/reference/android/net/ConnectivityManager#getNetworkInfo(int)
     */
    public boolean isOnline() {

        mIsConnected = false;

        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.P) {
            // Checking internet connectivity
            NetworkInfo activeNetwork = null;
            if (mConnectivityMgr != null) {
                activeNetwork = mConnectivityMgr.getActiveNetworkInfo(); // Deprecated in API 29
            }
            mIsConnected = activeNetwork != null;

        } else {
            Network[] allNetworks = mConnectivityMgr.getAllNetworks(); // added in API 21 (Lollipop)

            for (Network network : allNetworks) {
                NetworkCapabilities networkCapabilities = mConnectivityMgr.getNetworkCapabilities(network);
                if (networkCapabilities != null) {
                    if (networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)
                            || networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)
                            || networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_ETHERNET))
                        mIsConnected = true;
                }
            }
        }

        return mIsConnected;

    }


    /**
     * Returns
     * <p> <p>
     * <p><p> NO_NETWORK_AVAILABLE >>> when you're offline
     * <p><p> TRANSPORT_CELLULAR >> When Cellular is the active network
     * <p><p> TRANSPORT_WIFI >> When Wi-Fi is the Active network
     * <p>
     */
    public int getActiveNetwork() {

        NetworkInfo activeNetwork = mConnectivityMgr.getActiveNetworkInfo(); // Deprecated in API 29
        if (activeNetwork != null)

            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                NetworkCapabilities capabilities = mConnectivityMgr.getNetworkCapabilities(mConnectivityMgr.getActiveNetwork());
                if (capabilities != null)
                    if (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)) {
                        // connected to mobile data
                        return TRANSPORT_CELLULAR;

                    } else if (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)) {
                        // connected to wifi
                        return TRANSPORT_WIFI;
                    }

            } else {
                if (activeNetwork.getType() == ConnectivityManager.TYPE_MOBILE) { // Deprecated in API 28
                    // connected to mobile data
                    return TRANSPORT_CELLULAR;

                } else if (activeNetwork.getType() == ConnectivityManager.TYPE_WIFI) { // Deprecated in API 28
                    // connected to wifi
                    return TRANSPORT_WIFI;
                }
            }
        return NO_NETWORK_AVAILABLE;
    }


    @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
    public int getAvailableNetworksCount() {

        int count = 0;

        if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) {
            Network[] allNetworks = mConnectivityMgr.getAllNetworks(); // added in API 21 (Lollipop)
            for (Network network : allNetworks) {
                NetworkCapabilities networkCapabilities = mConnectivityMgr.getNetworkCapabilities(network);
                if (networkCapabilities != null)
                    if (networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)
                            || networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR))
                        count++;
            }

        }

        return count;
    }


    @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
    public List<Integer> getAvailableNetworks() {

        List<Integer> activeNetworks = new ArrayList<>();

        Network[] allNetworks; // added in API 21 (Lollipop)
        if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) {
            allNetworks = mConnectivityMgr.getAllNetworks();
            for (Network network : allNetworks) {
                NetworkCapabilities networkCapabilities = mConnectivityMgr.getNetworkCapabilities(network);
                if (networkCapabilities != null) {
                    if (networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI))
                        activeNetworks.add(TRANSPORT_WIFI);

                    if (networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR))
                        activeNetworks.add(TRANSPORT_CELLULAR);

                }
            }
        }

        return activeNetworks;
    }


    public void onInternetStateListener(ConnectionStateListener listener) {
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
            mNetworkStateReceiver = new NetworkStateReceiver(listener);
            IntentFilter intentFilter = new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION);
            mContext.registerReceiver(mNetworkStateReceiver, intentFilter);

        } else {
            mConnectionMonitor.setOnConnectionStateListener(listener);
        }
    }


    @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
    public void onDestroy() {
        Log.d(TAG, "onDestroy");
        ((AppCompatActivity) mContext).getLifecycle().removeObserver(this);

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            if (mConnectionMonitor != null)
                mConnectivityMgr.unregisterNetworkCallback(mConnectionMonitor);
        } else {
            if (mNetworkStateReceiver != null)
                mContext.unregisterReceiver(mNetworkStateReceiver);
        }

    }


    public class NetworkStateReceiver extends BroadcastReceiver {

        ConnectionStateListener mListener;

        public NetworkStateReceiver(ConnectionStateListener listener) {
            mListener = listener;
        }

        @Override
        public void onReceive(Context context, Intent intent) {
            if (intent.getExtras() != null) {

                NetworkInfo activeNetworkInfo = mConnectivityMgr.getActiveNetworkInfo(); // deprecated in API 29

                /*
                 * activeNetworkInfo.getState() deprecated in API 28
                 * NetworkInfo.State.CONNECTED deprecated in API 29
                 * */
                if (!mIsConnected && activeNetworkInfo != null && activeNetworkInfo.getState() == NetworkInfo.State.CONNECTED) {
                    Log.d(TAG, "onReceive: " + "Connected To: " + activeNetworkInfo.getTypeName());
                    mIsConnected = true;
                    mListener.onAvailable(true);

                } else if (intent.getBooleanExtra(ConnectivityManager.EXTRA_NO_CONNECTIVITY, Boolean.FALSE)) {
                    if (!isOnline()) {
                        mListener.onAvailable(false);
                        mIsConnected = false;
                    }

                }

            }
        }
    }


    @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
    public class ConnectionMonitor extends ConnectivityManager.NetworkCallback {

        private ConnectionStateListener mConnectionStateListener;

        void setOnConnectionStateListener(ConnectionStateListener connectionStateListener) {
            mConnectionStateListener = connectionStateListener;
        }

        @Override
        public void onAvailable(@NonNull Network network) {

            if (mIsConnected)
                return;

            Log.d(TAG, "onAvailable: ");

            if (mConnectionStateListener != null) {
                mConnectionStateListener.onAvailable(true);
                mIsConnected = true;
            }

        }

        @Override
        public void onLost(@NonNull Network network) {

            if (getAvailableNetworksCount() == 0) {
                mConnectionStateListener.onAvailable(false);
                mIsConnected = false;
            }

        }

    }

}
Zain
la source
@Rasel s'il vous plaît vérifier la réponse mise à jour, j'espère que cela pourrait aider
Zain
Si l'utilisateur est connecté au Wifi et aux données mobiles en même temps, et perd la connexion dans l'un d'eux, il onLostsera appelé. onLostne signifie pas que l'appareil a perdu la connexion Internet, mais qu'un réseau a perdu la connexion.
Gokhan Arik
@Gokhan Arik .. Belle prise Je travaille dessus pour la résoudre
Zain
1
Consultez cette discussion gist.github.com/PasanBhanu/730a32a9eeb180ec2950c172d54bb06a
Gokhan Arik
@GokhanArik merci pour l'aide .. Je viens de mettre à jour ma réponse et élargi l'utilisation de l'API, merci de me le faire savoir si vous remarquez des bugs
Zain
4

Il est bon de vérifier si votre réseau est connecté à Internet:

@Suppress("DEPRECATION")
fun isNetworkAvailable(context: Context): Boolean {
    try {
        val cm = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
        return if (Build.VERSION.SDK_INT > 22) {
            val an = cm.activeNetwork ?: return false
            val capabilities = cm.getNetworkCapabilities(an) ?: return false
            capabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
        } else {
            val a = cm.activeNetworkInfo ?: return false
            a.isConnected && (a.type == ConnectivityManager.TYPE_WIFI || a.type == ConnectivityManager.TYPE_MOBILE)
        }
    } catch (e: Exception) {
        e.printStackTrace()
    }
    return false
}
Anggrayudi H
la source
Vous voudrez peut-être également vérifier NetworkCapabilities.NET_CAPABILITY_VALIDATED.
JJD
3

Version Kotlin:

fun isInternetOn(context: Context): Boolean {
   val cm = context.getSystemService(Context.CONNECTIVITY_SERVICE) as? ConnectivityManager
   val activeNetwork = cm?.activeNetworkInfo
   return activeNetwork != null && activeNetwork.isConnected
}
SANAT
la source
3

Comme le suggère Cheese Bread , utilisez getActiveNetworkInfo ()

getActiveNetworkInfo

Ajouté au niveau d'API 1

NetworkInfo getActiveNetworkInfo ()

Renvoie des détails sur le réseau de données par défaut actuellement actif. Une fois connecté, ce réseau est l'itinéraire par défaut pour les connexions sortantes. Vous devez toujours vérifier isConnected () avant de lancer le trafic réseau. Cela peut retourner null lorsqu'il n'y a pas de réseau par défaut. Cette méthode nécessite que l'appelant détienne l'autorisation ACCESS_NETWORK_STATE. Renvoie NetworkInfo un objet NetworkInfo pour le réseau par défaut actuel ou null si aucun réseau par défaut n'est actuellement actif.

Référence: Android Studio

 public final boolean isInternetOn() {

    // get Connectivity Manager object to check connection
    ConnectivityManager connec =
            (ConnectivityManager)getSystemService(getBaseContext().CONNECTIVITY_SERVICE);

    // Check for network connections
    if ( connec.getActiveNetworkInfo().getState() == android.net.NetworkInfo.State.CONNECTED ||
            connec.getActiveNetworkInfo().getState() == android.net.NetworkInfo.State.CONNECTING ) {

        // if connected with internet

        Toast.makeText(this, connec.getActiveNetworkInfo().getTypeName(), Toast.LENGTH_LONG).show();
        return true;

    } else if (
            connec.getActiveNetworkInfo().getState() == android.net.NetworkInfo.State.DISCONNECTED ||
                    connec.getActiveNetworkInfo().getState() == android.net.NetworkInfo.State.DISCONNECTED  ) {

        Toast.makeText(this, " Not Connected ", Toast.LENGTH_LONG).show();
        return false;
    }
    return false;
}

appelez maintenant la méthode, pour une utilisation en toute sécurité, essayez catch

try {
    if (isInternetOn()) { /* connected actions */ }
    else { /* not connected actions */ }
} catch (Exception e){
  Toast.makeText(this, e.getMessage(), Toast.LENGTH_SHORT).show();
}

Et n'oubliez pas d'ajouter:

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
Sanjoy Kanrar
la source
merci c'est utile. lorsque nous vérifions l'état du réseau et si le wifi et les données sont tous les deux désactivés, l'application se bloque à ce moment-là, mais essayez de résoudre le problème.
Rucha Bhatt Joshi
Cependant, cela ne fonctionne pas si je veux vérifier si un type spécifique de réseau est présent énumérer tous les réseaux présents, c'estgetNetworkInfo(ConnectivityManager.TYPE_ETHERNET).isAvailable
m0skit0
3
getState () obsolète!
Diego Venâncio
Plusieurs instructions obsolètes!
SMBiggs
2

Afin d'être du bon côté, je suggérerais d'utiliser également la méthode

NetworkInfo.isConnected ()

La méthode entière pourrait être comme ci-dessous:

/**
 * Checking whether network is connected
 * @param context Context to get {@link ConnectivityManager}
 * @return true if Network is connected, else false
 */
public static boolean isConnected(Context context){
    ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
    if (activeNetwork != null && activeNetwork.isConnected()) {
        int networkType = activeNetwork.getType();
        return networkType == ConnectivityManager.TYPE_WIFI || networkType == ConnectivityManager.TYPE_MOBILE;
    } else {
        return false;
    }
}
Vlad
la source
9
activeNetwork.getType()est obsolète et ConnectivityManager.TYPE_WIFI obsolète
Godwin
2

Voici comment je vérifie si le réseau actuel utilise le cellulaire ou non sur les dernières versions d'Android:

val isCellular: Boolean get() {
    val cm = getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
    return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        cm.getNetworkCapabilities(cm.activeNetwork).hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)
    } else {
        cm.activeNetworkInfo?.type == ConnectivityManager.TYPE_MOBILE
    }
}
tmm1
la source
2

(Presque) Toutes les réponses sont obsolètes dans Android P, voici donc la C#solution ( qui est facile à suivre pour les développeurs Java )

public bool IsOnline(Context context)
{
    var cm = (ConnectivityManager)context.GetSystemService(Context.ConnectivityService);

    if (cm == null) return false;

    if (Build.VERSION.SdkInt < BuildVersionCodes.M)
    {
        var ni = cm.ActiveNetworkInfo;

        if (ni == null) return false;

        return ni.IsConnected && (ni.Type == ConnectivityType.Wifi || ni.Type == ConnectivityType.Mobile);
    }

    return cm.GetNetworkCapabilities(cm.ActiveNetwork).HasTransport(Android.Net.TransportType.Wifi)
        || cm.GetNetworkCapabilities(cm.ActiveNetwork).HasTransport(Android.Net.TransportType.Cellular);
}   

La clé ici est Android.Net.TransportType

Mehdi Dehghani
la source
Aaaannnndddd tout ce qui s'y trouve est DÉPRÉCIÉ!
Prescott Chartier
@PrescottChartier dans quelle version?
Mehdi Dehghani
2

Il se peut que nous devions vérifier la connectivité Internet plusieurs fois. Donc, ce sera plus facile pour nous si nous écrivons le bloc de code dans une méthode d'extension de Context. Voici mes extensions d'aide pour Contextet Fragment.

Vérification de la connexion Internet

fun Context.hasInternet(): Boolean {
    val connectivityManager = getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
    return if (Build.VERSION.SDK_INT < 23) {
        val activeNetworkInfo = connectivityManager.activeNetworkInfo
        activeNetworkInfo != null && activeNetworkInfo.isConnected
    } else {
        val nc = connectivityManager.getNetworkCapabilities(connectivityManager.activeNetwork)
        if (nc == null) {
            false
        } else {
            nc.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR) ||
                    nc.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)
        }
    }
}

Autres extensions

fun Context.hasInternet(notifyNoInternet: Boolean = true, trueFunc: (internet: Boolean) -> Unit) {
    if (hasInternet()) {
        trueFunc(true)
    } else if (notifyNoInternet) {
        Toast.makeText(this, "No Internet Connection!", Toast.LENGTH_SHORT).show()
    }
}

fun Context.hasInternet(
    trueFunc: (internet: Boolean) -> Unit,
    falseFunc: (internet: Boolean) -> Unit
) {
    if (hasInternet()) {
        trueFunc(true)
    } else {
        falseFunc(true)
    }
}

fun Fragment.hasInternet(): Boolean = context!!.hasInternet()

fun Fragment.hasInternet(notifyNoInternet: Boolean = true, trueFunc: (internet: Boolean) -> Unit) =
    context!!.hasInternet(notifyNoInternet, trueFunc)

fun Fragment.hasInternet(
    trueFunc: (internet: Boolean) -> Unit, falseFunc: (internet: Boolean) -> Unit
) = context!!.hasInternet(trueFunc, falseFunc)
Sagar Chapagain
la source
2

vérifier si Internet est disponible

@RequiresPermission(allOf = [
    Manifest.permission.ACCESS_NETWORK_STATE, 
    Manifest.permission.INTERNET
])
fun isInternetAvailable(context: Context): Boolean {
    val connectivityManager = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager?
    val activeNetworkInfo = connectivityManager!!.activeNetworkInfo
    return activeNetworkInfo != null && activeNetworkInfo.isConnected
}
Alireza Tizfahm Fard
la source
2

ConnectivitéManager.getActiveNetwork () ne se trouve pas dans ci-dessous android M (API 28). networkInfo.getState () est obsolète au-dessus d'android L.

Donc, la réponse finale est:

public static boolean isConnectingToInternet(Context mContext) {
    if (mContext == null) return false;

    ConnectivityManager connectivityManager = (ConnectivityManager) mContext.getSystemService(Context.CONNECTIVITY_SERVICE);
    if (connectivityManager != null) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            final Network network = connectivityManager.getActiveNetwork();
            if (network != null) {
                final NetworkCapabilities nc = connectivityManager.getNetworkCapabilities(network);

                return (nc.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR) ||
                        nc.hasTransport(NetworkCapabilities.TRANSPORT_WIFI));
            }
        } else {
            NetworkInfo[] networkInfos = connectivityManager.getAllNetworkInfo();
            for (NetworkInfo tempNetworkInfo : networkInfos) {
                if (tempNetworkInfo.isConnected()) {
                    return true;
                }
            }
        }
    }
    return false;
}
vidha
la source
1
Vous dites que getActiveNetwork () ne se trouve pas dans Android sous M, mais votre code l'utilise sur Lollipop!?
3c71 le
2

De nombreuses réponses utilisent encore getNetworkType inférieur à 23, ce qui est obsolète; utilisez le code ci-dessous pour vérifier si l'appareil dispose d'une connexion Internet.

public static boolean isNetworkConnected(Context context) {

    ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);

    if (cm != null) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            NetworkCapabilities capabilities = cm.getNetworkCapabilities(cm.getActiveNetwork());
            return capabilities != null && (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI) || capabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR));
        } else {
            NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
            return activeNetwork != null && activeNetwork.isConnected();
        }
    }

    return false;
}

..

Et n'oubliez pas d'ajouter cette ligne dans Manifest

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
Nilesh Rathore
la source
1

Étant donné que les réponses publiées vous permettent uniquement d'interroger le réseau actif, voici comment obtenir NetworkInfopour n'importe quel réseau, pas seulement le réseau actif (par exemple, le réseau Wifi) (désolé, code Kotlin à l'avance)

(getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager).run {
    allNetworks.find { getNetworkInfo(it).type == ConnectivityManager.TYPE_WIFI }?.let { network -> getNetworkInfo(network) }
//    getNetworkInfo(ConnectivityManager.TYPE_WIFI).isAvailable // This is the deprecated API pre-21
}

Cela nécessite l'API 21 ou une version ultérieure et l'autorisation android.permission.ACCESS_NETWORK_STATE

m0skit0
la source
1
currentNetwork.getType () et ConnectivityManager.TYPE_WIFI sont tous deux obsolètes dans l'API 28.
Abushawish
@Abushawish Quelle est la solution recommandée pour l'API 28?
tmm1
Le remplacement est maintenantcm.getNetworkCapabilities(cm.activeNetwork).hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)
tmm1
1

NetManager que vous pouvez utiliser pour vérifier la connexion Internet sur Android avec Kotlin

Si vous utilisez minSdkVersion> = 23

class NetManager @Inject constructor(var applicationContext: Context) {
    val isConnectedToInternet: Boolean?
        get() = with(
            applicationContext.getSystemService(Context.CONNECTIVITY_SERVICE)
                    as ConnectivityManager
        ) {
            isConnectedToInternet()
        }
}

fun ConnectivityManager.isConnectedToInternet() = isConnected(getNetworkCapabilities(activeNetwork))

fun isConnected(networkCapabilities: NetworkCapabilities?): Boolean {
    return when (networkCapabilities) {
        null -> false
        else -> with(networkCapabilities) { hasTransport(TRANSPORT_CELLULAR) || hasTransport(TRANSPORT_WIFI) }
    }
}

Si vous utilisez minSdkVersion <23

class NetManager @Inject constructor(var applicationContext: Context) {
    val isConnectedToInternet: Boolean?
        get() = with(
            applicationContext.getSystemService(Context.CONNECTIVITY_SERVICE)
                    as ConnectivityManager
        ) {
            isConnectedToInternet()
        }
}

fun ConnectivityManager.isConnectedToInternet(): Boolean = if (Build.VERSION.SDK_INT < 23) {
    isConnected(activeNetworkInfo)
} else {
    isConnected(getNetworkCapabilities(activeNetwork))
}


fun isConnected(network: NetworkInfo?): Boolean {
    return when (network) {
        null -> false
        else -> with(network) { isConnected && (type == TYPE_WIFI || type == TYPE_MOBILE) }
    }
}

fun isConnected(networkCapabilities: NetworkCapabilities?): Boolean {
    return when (networkCapabilities) {
        null -> false
        else -> with(networkCapabilities) { hasTransport(TRANSPORT_CELLULAR) || hasTransport(TRANSPORT_WIFI) }
    }
}
Studio Cube
la source
1

https://www.agnosticdev.com/content/how-detect-network-connectivity-android

veuillez suivre ce tutoriel, il devrait aider tous ceux qui recherchent des réponses.

notez que networkInfo est obsolète, remplacez-le par isNetworkReacheable () par la réponse @vidha ci-dessous en passant getApplicationContext () comme paramètre

  public static boolean isNetworkReacheable(Context context) {
    boolean result = false;
    ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        if (cm != null) {
            NetworkCapabilities capabilities = cm.getNetworkCapabilities(cm.getActiveNetwork());
            if (capabilities != null) {
                if (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)) {
                    result = true;
                } else if (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)) {
                    result = true;
                }
            }
        }
    } else {
        if (cm != null) {
            NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
            if (activeNetwork != null) {
                // connected to the internet
                if (activeNetwork.getType() == ConnectivityManager.TYPE_WIFI) {
                    result = true;
                } else if (activeNetwork.getType() == ConnectivityManager.TYPE_MOBILE) {
                    result = true;
                }
            }
        }
    }
    return result;
}
commitware
la source
0
public boolean isConnectedToWifi(Context context) {
    ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
    if (connectivityManager == null) {
        return false;
    }

    if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) {
        Network network = connectivityManager.getActiveNetwork();
        NetworkCapabilities capabilities = connectivityManager.getNetworkCapabilities(network);
        if (capabilities == null) {
            return false;
        }
        return capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI);
    } else {
        NetworkInfo networkInfo = connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
        if (networkInfo == null) {
            return false;
        }
        return networkInfo.isConnected();
    }
}
Syed Zeeshan
la source
0

Cela fonctionne pour moi à Kotlin. De nombreuses API sont obsolètes dans la classe Network Manager, donc la réponse ci-dessous couvre toute la prise en charge des API.

fun isNetworkAvailable(context: Context): Boolean {
    var result = false
    (context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager).apply {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                result = isCapableNetwork(this,this.activeNetwork)
            } else {
                val networkInfos = this.allNetworks
                for (tempNetworkInfo in networkInfos) {
                    if(isCapableNetwork(this,tempNetworkInfo))
                        result =  true
                }
            }
        }

    return result
}

fun isCapableNetwork(cm: ConnectivityManager,network: Network?): Boolean{
     cm.getNetworkCapabilities(network)?.also {
        if (it.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)) {
            return true
        } else if (it.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)) {
            return true
        }
    }
    return false
}

Vous ajouterez également ci-dessous

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
Alok Gupta
la source
0

Le code ci-dessous fonctionne sur toutes les API. (Kotlin)

Cependant, getActiveNetworkInfo () est obsolète uniquement dans l'API 29 et fonctionne sur toutes les API, nous pouvons donc l'utiliser dans toutes les API inférieures à 29

fun isInternetAvailable(context: Context): Boolean {
            var result = false
            val connectivityManager =
                context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                val networkCapabilities = connectivityManager.activeNetwork ?: return false
                val actNw =
                    connectivityManager.getNetworkCapabilities(networkCapabilities) ?: return false
                result = when {
                    actNw.hasTransport(NetworkCapabilities.TRANSPORT_WIFI) -> true
                    actNw.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR) -> true
                    actNw.hasTransport(NetworkCapabilities.TRANSPORT_ETHERNET) -> true
                    else -> false
                }
            } else {
                connectivityManager.run {
                    connectivityManager.activeNetworkInfo?.run {
                        result = when (type) {
                            ConnectivityManager.TYPE_WIFI -> true
                            ConnectivityManager.TYPE_MOBILE -> true
                            ConnectivityManager.TYPE_ETHERNET -> true
                            else -> false
                        }

                    }
                }
            }

            return result
        }
Gowtham. R
la source
0

Quelque chose comme ça:

public boolean hasConnection(final Context context){
    ConnectivityManager cm = (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo activeNW = cm.getActiveNetworkInfo();
    if (activeNW != null && activeNW.isConnected())
    {
        return true;
    }
    return false;
}

Et dans le corps principal du programme:

if(hasConnection(this)) {
    Toast.makeText(this, "Active networks OK ", Toast.LENGTH_LONG).show();
    getAccountData(token, tel);
}
else  Toast.makeText(this, "No active networks... ", Toast.LENGTH_LONG).show();
Андрей Иванов
la source
0

Cela fonctionnera également dans Android 10. Il retournera vrai s'il est connecté à Internet, sinon il retournera faux.

private fun isOnline(): Boolean {
        val connectivityManager =
                getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
        val capabilities =
                connectivityManager.getNetworkCapabilities(connectivityManager.activeNetwork)
        if (capabilities != null) {
            when {
                capabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR) -> {
                    Log.i("Internet", "NetworkCapabilities.TRANSPORT_CELLULAR")
                    return true
                }
                capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI) -> {
                    Log.i("Internet", "NetworkCapabilities.TRANSPORT_WIFI")
                    return true
                }
                capabilities.hasTransport(NetworkCapabilities.TRANSPORT_ETHERNET) -> {
                    Log.i("Internet", "NetworkCapabilities.TRANSPORT_ETHERNET")
                    return true
                }
            }
        }
        return false
    }
Shylendra Madda
la source