web-dev-qa-db-fra.com

Détecter si une connexion Internet est disponible sur Android

Je dois détecter si le périphérique Android est connecté à Internet.

La classe NetworkInfo fournit une méthode non statique isAvailable() qui sonne parfaitement.

Le problème est que:

NetworkInfo ni = new NetworkInfo();
if (!ni.isAvailable()) {
    // do something
}

jette cette erreur:

The constructor NetworkInfo is not visible.

Il y a fort à parier qu'une autre classe renvoie un objet NetworkInfo. Mais je ne sais pas lequel.

  1. Comment faire fonctionner l'extrait de code ci-dessus?
  2. Comment aurais-je pu trouver moi-même les informations dont j'avais besoin dans la documentation en ligne?
  3. Pouvez-vous suggérer un meilleur moyen pour ce type de détection?
655
dan

La méthode getActiveNetworkInfo() de ConnectivityManager renvoie une instance NetworkInfo représentant la première interface réseau connectée qu'elle peut trouver ou null si aucune des interfaces n'est connectée. Vérifier si cette méthode retourne null devrait suffire à dire si une connexion Internet est disponible ou non.

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

Vous aurez également besoin de:

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

dans votre manifeste Android.

Edit:

Notez que le fait d'avoir une interface réseau active ne garantit pas qu'un service en réseau particulier est disponible. Les problèmes de réseau, les temps d'arrêt du serveur, les signaux faibles, les portails captifs, les filtres de contenu, etc. peuvent empêcher votre application d'accéder à un serveur. Par exemple, vous ne pouvez pas savoir avec certitude si votre application peut accéder à Twitter jusqu'à ce que vous receviez une réponse valide du service Twitter.

1367
Alex Jasmin

Je vérifie les connexions Wi-fi et Internet mobile comme suit ...

private boolean haveNetworkConnection() {
    boolean haveConnectedWifi = false;
    boolean haveConnectedMobile = false;

    ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo[] netInfo = cm.getAllNetworkInfo();
    for (NetworkInfo ni : netInfo) {
        if (ni.getTypeName().equalsIgnoreCase("WIFI"))
            if (ni.isConnected())
                haveConnectedWifi = true;
        if (ni.getTypeName().equalsIgnoreCase("MOBILE"))
            if (ni.isConnected())
                haveConnectedMobile = true;
    }
    return haveConnectedWifi || haveConnectedMobile;
}

De toute évidence, il pourrait facilement être modifié pour vérifier des types de connexion spécifiques, par exemple si votre application a besoin des vitesses potentiellement plus élevées du Wi-Fi pour fonctionner correctement, etc.

235
Squonk

Étape 1: Créez une classe AppStatus dans votre projet (vous pouvez également donner un autre nom). Ensuite, veuillez coller les lignes ci-dessous dans votre code:

import Android.content.Context;
import Android.net.ConnectivityManager;
import Android.net.NetworkInfo;
import Android.util.Log;


public class AppStatus {

    private static AppStatus instance = new AppStatus();
    static Context context;
    ConnectivityManager connectivityManager;
    NetworkInfo wifiInfo, mobileInfo;
    boolean connected = false;

    public static AppStatus getInstance(Context ctx) {
        context = ctx.getApplicationContext();
        return instance;
    }

    public boolean isOnline() {
        try {
            connectivityManager = (ConnectivityManager) context
                        .getSystemService(Context.CONNECTIVITY_SERVICE);

        NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();
        connected = networkInfo != null && networkInfo.isAvailable() &&
                networkInfo.isConnected();
        return connected;


        } catch (Exception e) {
            System.out.println("CheckConnectivity Exception: " + e.getMessage());
            Log.v("connectivity", e.toString());
        }
        return connected;
    }
}

Étape 2: Maintenant, pour vérifier si votre appareil dispose d'une connectivité réseau, ajoutez simplement cet extrait de code où que vous souhaitiez vérifier ...

if (AppStatus.getInstance(this).isOnline()) {

    Toast.makeText(this,"You are online!!!!",8000).show();

} else {

    Toast.makeText(this,"You are not online!!!!",8000).show();
    Log.v("Home", "############################You are not online!!!!");    
}
71
Vivek Parihar

Aussi une autre note importante. Vous devez définir Android.permission.ACCESS_NETWORK_STATE dans votre AndroidManifest.xml pour que cela fonctionne.

_ Comment aurais-je pu trouver les informations dont j'avais besoin dans la documentation en ligne?

Il vous suffit de lire suffisamment la documentation sur les classes et vous y trouverez toutes les réponses que vous recherchez. Consultez la documentation sur ConnectivityManager . La description vous dit quoi faire.

14
Octavian Damiean

La méthode getActiveNetworkInfo () de ConnectivityManager renvoie une instance NetworkInfo représentant la première interface réseau connectée qu'elle peut trouver ou la valeur null si aucune n'est connectée si les interfaces sont connectées. Vérifier si cette méthode renvoie null devrait suffire à indiquer si une connexion Internet est disponible.

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

Vous aurez également besoin de:

dans votre manifeste Android.

Modifier:

Notez que le fait d'avoir une interface réseau active ne garantit pas qu'un service en réseau particulier est disponible. Les problèmes de réseau, les temps d'arrêt des serveurs, les signaux faibles, les portails captifs, les filtres de contenu, etc. peuvent empêcher votre application d'accéder à un serveur. Par exemple, vous ne pouvez pas savoir avec certitude si votre application peut accéder à Twitter jusqu'à ce que vous receviez une réponse valide du service Twitter.

getActiveNetworkInfo () ne devrait jamais donner la valeur null. Je ne sais pas à quoi ils pensaient quand ils ont trouvé ça. Cela devrait toujours vous donner un objet.

10
axllaruse

Je me suis probablement retrouvé:

ConnectivityManager connectivityManager = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
return connectivityManager.getActiveNetworkInfo().isConnectedOrConnecting();
8
dan