149 votes

Détecter si l'appareil Android dispose d'une connexion Internet

J'ai besoin de savoir si mon appareil est connecté à Internet ou non. J'ai trouvé de nombreuses réponses comme :

private boolean isNetworkAvailable() {
    ConnectivityManager connectivityManager 
         = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();
    return activeNetworkInfo != null;
}

(Tiré de Détecter si une connexion Internet est disponible sur Android .)

Mais ce n'est pas juste, par exemple si je suis connecté à un réseau sans fil qui n'a pas d'accès à Internet cette méthode retournera vrai Existe-t-il un moyen de savoir si l'appareil est connecté à Internet et non s'il est seulement connecté à quelque chose ?

0 votes

Vous pouvez aussi utiliser [this][1]. Cela pourrait aider ! [1] : stackoverflow.com/questions/4238921/

0 votes

0 votes

Le site isNetworkConnected Le bloc de fonctions contient du code déprécié pour toutes les Build.VERSION.SDK_INT >= Build.VERSION_CODES.M . Une discussion plus approfondie sur le sujet et la manière de le résoudre se trouve ici. stackoverflow.com/questions/53532406/

188voto

THelper Points 5527

Vous avez raison. Le code que vous avez fourni vérifie seulement s'il y a une connexion réseau. La meilleure façon de vérifier s'il existe une connexion Internet active est d'essayer de se connecter à un serveur connu via http.

public static boolean hasActiveInternetConnection(Context context) {
    if (isNetworkAvailable(context)) {
        try {
            HttpURLConnection urlc = (HttpURLConnection) (new URL("http://www.google.com").openConnection());
            urlc.setRequestProperty("User-Agent", "Test");
            urlc.setRequestProperty("Connection", "close");
            urlc.setConnectTimeout(1500); 
            urlc.connect();
            return (urlc.getResponseCode() == 200);
        } catch (IOException e) {
            Log.e(LOG_TAG, "Error checking internet connection", e);
        }
    } else {
        Log.d(LOG_TAG, "No network available!");
    }
    return false;
}

Bien sûr, vous pouvez remplacer le http://www.google.com URL de tout autre serveur auquel vous souhaitez vous connecter, ou d'un serveur dont vous savez qu'il a un bon temps de fonctionnement.

Comme Tony Cho l'a également souligné dans ce commentaire ci-dessous Assurez-vous de ne pas exécuter ce code sur le thread principal, sinon vous obtiendrez une exception NetworkOnMainThread (sous Android 3.0 ou ultérieur). Utilisez plutôt un AsyncTask ou un Runnable.

9 votes

@varunbhardwaj vous pouvez simplement prendre un site web différent (par ex. baidu.com lorsque vous déployez votre application en Chine), ou vous pouvez essayer un deuxième site si le premier échoue pour vous assurer qu'il n'y a pas de connexion.

2 votes

J'ai +1 votre réponse et je sais l'utiliser dans mon application, mais il y a un grand cas de dépendance sur un site web et ma question reste toujours sans réponse. en tout cas, une excellente solution de contournement merci.

0 votes

@THelper Combien de temps doit-on attendre la réponse du serveur ?

97voto

Jeshurun Points 7257

J'ai légèrement modifié la réponse de THelper, pour utiliser un hack connu qu'Android utilise déjà pour vérifier si le réseau WiFi connecté a un accès Internet. C'est beaucoup plus efficace que de récupérer l'intégralité de la page d'accueil de Google. Voir ici et ici pour plus d'informations.

public static boolean hasInternetAccess(Context context) {
    if (isNetworkAvailable(context)) {
        try {
            HttpURLConnection urlc = (HttpURLConnection) 
                (new URL("http://clients3.google.com/generate_204")
                .openConnection());
            urlc.setRequestProperty("User-Agent", "Android");
            urlc.setRequestProperty("Connection", "close");
            urlc.setConnectTimeout(1500); 
            urlc.connect();
            return (urlc.getResponseCode() == 204 &&
                        urlc.getContentLength() == 0);
        } catch (IOException e) {
            Log.e(TAG, "Error checking internet connection", e);
        }
    } else {
        Log.d(TAG, "No network available!");
    }
    return false;
}

2 votes

Bonjour, est-il possible d'utiliser cette pratique dans les applications actuelles ?

1 votes

Est-ce efficace de l'implémenter dans notre application actuelle ?

7 votes

Ce serait beaucoup plus efficace que la méthode décrite dans la réponse ci-dessus. Saisir la page d'accueil de Google est très inefficace, surtout s'il y a un doodle dessus.

0voto

Naruto Points 2707

Voici un exemple simple qui décrit comment obtenir l'état internet du téléphone. Il y a aussi un exemple de bloc de snippet. Vous pouvez facilement savoir si le téléphone est en Wifi ou en données mobiles.

http://www.feelzdroid.com/2014/09/Android-phone-internet-connectivity-status-example-code.html

-2voto

user2084974 Points 37

Utilisez la méthode ConnectionDetector pour détecter la connexion Internet comme indiqué à l'adresse suivante http://androidcodexamples.blogspot.com/2013/02/how-to-detect-internet-connection-after.html

-20voto

Zulfiqar Ali Points 368

/** * Vérifie si le périphérique est connecté à Internet. * @retourne vrai ou faux. */

public static boolean isOnline() {
    Context context = Application.getContext();
    ConnectivityManager cm = (ConnectivityManager) context
        .getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo netInfo = cm.getActiveNetworkInfo();
    if (netInfo != null && netInfo.isConnectedOrConnecting()) {
        return true;
    }
    return false;
}

Si vous voulez utiliser ce code, vous devez ajouter la permission suivante à votre fichier manifeste :

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

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