web-dev-qa-db-fra.com

Android Vérification de la connectivité Internet meilleure méthode

Selon le Android, Déterminer et surveiller l'état de la connectivité, nous pouvons vérifiez qu'il y a une connexion Internet active. Mais cela ne fonctionne pas si même seulement le Wi-Fi est connecté et pas Internet disponible (il informe qu'il y a une connexion Internet).

Maintenant, je teste un site Web et vérifie si des connexions Internet sont disponibles ou non. Et cette méthode a besoin de plus de temps de traitement. Existe-t-il une meilleure méthode pour vérifier la connectivité Internet que celle-ci pour éviter le délai de ping de l'adresse?

16
Rohith Krishnan

Essaye ça:

C'est vraiment simple et rapide:

public boolean isInternetAvailable(String address, int port, int timeoutMs) {
    try {
        Socket sock = new Socket();
        SocketAddress sockaddr = new InetSocketAddress(address, port);

        sock.connect(sockaddr, timeoutMs); // This will block no more than timeoutMs
        sock.close();

        return true;

    } catch (IOException e) { return false; }
}

Ensuite, là où vous voulez vérifier, utilisez simplement ceci:

if (isInternetAvailable("8.8.8.8", 53, 1000)) {
     // Internet available, do something
} else {
     // Internet not available
}
9
sumit

Essayez ce qui suit:

public boolean checkOnlineState() {
    ConnectivityManager CManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo NInfo = CManager.getActiveNetworkInfo();
    if (NInfo != null && NInfo.isConnectedOrConnecting()) {
        return true;
    }
    return false;
}

N'oubliez pas l'accès:

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

Autre:

if (InetAddress.getByName("www.google.com").isReachable(timeout))
{    }
else
{    }
4
Atlas_Gondal

Le premier problème que vous devez préciser est ce que vous entendez par whether internet is available?

  • Non connecté au wifi ou au réseau cellulaire;
  • Connecté à un wifi limité: par ex. Dans un réseau scolaire, si vous vous connectez au wifi de l'école, vous pouvez accéder directement à l'intranet. Mais vous devez vous connecter avec le compte de l'école pour accéder à l'extranet. Dans ce cas, si vous envoyez une requête ping à un site Web extranet, vous pouvez recevoir une réponse car un intranet a fait une redirection automatique vers la page de connexion;
  • Connecté au wifi illimité: vous êtes libre d'accéder à la plupart des sites Internet;

Le deuxième problème est que voulez-vous réaliser?

Pour autant que je comprends votre description, vous semblez vouloir tester la connexion du réseau et rappeler à l'utilisateur s'il échoue. Je vous recommande donc simplement de faire un ping sur votre serveur, ce qui est toujours bien si vous souhaitez échanger des données avec lui.


Vous vous demandez s'il existe un meilleur moyen de tester la connectivité, et la réponse est non.

Le réseau TCP/IP actuel est circuit virtuel, à commutation de paquets réseau, ce qui signifie qu'il n'y a pas de "chemin" fixe pour les données à exécuter, c'est-à-dire pas comme un téléphone, nous avons une vraie connexion entre deux utilisateurs, nous pouvons savoir que la connexion est perdue immédiatement après la coupure du circuit. Nous devons envoyer un paquet à la destination et ne trouver aucune réponse, alors nous savons que nous perdons la connexion (ce que fait ping - protocole ICMP -).

En conclusion, nous n'avons pas de meilleur moyen de tester la connectivité à un hôte autre que le ping, c'est pourquoi battement de cœur est utilisé dans la gestion des services.

4
Tony

En vérifiant ce problème, il a constaté que nous ne pouvons pas déterminer s'il existe une connexion Internet active, en utilisant la méthode spécifiée sur le site du développeur: https://developer.Android.com/training/monitoring-device-state/ connectivité-monitoring.html

Cela ne vérifiera que la connexion active du wifi.

J'ai donc trouvé 2 méthodes qui vérifieront s'il y a une connexion Internet active

1.Ping un site Web en utilisant la méthode ci-dessous

URL url = new URL(myUrl);
        HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
        // 30 second time out.
        httpURLConnection.setConnectTimeout(30000);
        httpURLConnection.connect();
        if (httpURLConnection.getResponseCode() == HttpURLConnection.HTTP_OK) {
            isAvailable = true;
        }

2.Vérifiez la disponibilité de Google DNS à l'aide du socket

  try {
        Socket sock = new Socket();
        SocketAddress sockaddr = new InetSocketAddress("8.8.8.8", 53);

        sock.connect(sockaddr, 1000); // this will block no more than timeoutMs
        sock.close();

        return true;
} 

La deuxième méthode est un peu plus rapide que la 2e méthode (ce qui convient à mes besoins)

Merci à tous pour les réponses et le soutien.

2
Rohith Krishnan

Vous pouvez essayer ceci pour vérifier la connectivité Internet:

/**
 * Check Connectivity of network.
 */
public static boolean isOnline(Context context) {
    try {
        if (context == null)
            return false;

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

        if (cm != null) {
            if (cm.getActiveNetworkInfo() != null) {
                return cm.getActiveNetworkInfo().isConnected();
            } else {
                return false;
            }
        } else {
            return false;
        }
    }
    catch (Exception e) {
        Log.error("Exception", e);
        return false;
    }
}

Dans votre activité, vous appelez cette fonction comme ceci.

if(YourClass.isOnline(context))
{
  // Do your stuff here.
}
else
{
  // Show alert, no Internet connection.
}

N'oubliez pas d'ajouter ACCESS_NETWORK_STATE PERMISSION:

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

Essayez ceci si vous souhaitez simplement envoyer une requête ping à l'URL:

public static boolean isPingAvailable(String myUrl) {
    boolean isAvailable = false;
    try {
        URL url = new URL(myUrl);
        HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
        // 30 second time out.
        httpURLConnection.setConnectTimeout(30000);
        httpURLConnection.connect();
        if (httpURLConnection.getResponseCode() == HttpURLConnection.HTTP_OK) {
            isAvailable = true;
        }
    } catch (Exception e) {
        isAvailable = false;
        e.printStackTrace();
    }
    return isAvailable;
}
1
Andy Developer

// *** Pour vérifier l'accès à Internet

public static Boolean isOnline(){

    boolean isAvailable = false;
    try {

        StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
        StrictMode.setThreadPolicy(policy);
        URL url = new URL("https://stackoverflow.com/");
        HttpURLConnection httpURLConnection = null;
        httpURLConnection = (HttpURLConnection) url.openConnection();

        // 2 second time out.
        httpURLConnection.setConnectTimeout(2000);
        httpURLConnection.connect();
        if (httpURLConnection.getResponseCode() == HttpURLConnection.HTTP_OK) {
            isAvailable = true;
        } else {
            isAvailable = false;
        }
    } catch (IOException e) {
        e.printStackTrace();
        isAvailable = false;
    }

    if (isAvailable){
        return true;
    }else {
        return false;
    }
}
1
Milad shoeibi

Peut-être que cela peut vous aider:

private boolean checkInternetConnection() {
        ConnectivityManager cm = (ConnectivityManager)
getSystemService(Context.CONNECTIVITY_SERVICE);
        // Test for connection
        if (cm.getActiveNetworkInfo() != null
            && cm.getActiveNetworkInfo().isAvailable()
            && cm.getActiveNetworkInfo().isConnected()) {
        return true;
    } 
    else {
        return false;
    }
}
1
jeevan venugopal

Je voulais commenter, mais pas assez de réputation: /

Quoi qu'il en soit, un problème avec la réponse acceptée est qu'il n'attrape pas d'exception SocketTimeoutException, que j'ai vue dans la nature (Android) qui provoque des plantages.

public boolean isInternetAvailable(String address, int port, int timeoutMs) {
    try {
        Socket sock = new Socket();
        SocketAddress sockaddr = new InetSocketAddress(address, port);

        sock.connect(sockaddr, timeoutMs); // This will block no more than timeoutMs
        sock.close();

        return true;

    } catch (IOException e) { 
        return false; 
    } catch (SocketTimeoutException e) {
        return false;
    }
}
1
Justin Midyet

Essayez cette méthode, cela vous aidera à:

public static boolean isNetworkConnected(Context context)
{
    ConnectivityManager connectivityManager = (ConnectivityManager)
            context.getSystemService(Context.CONNECTIVITY_SERVICE);
    if (connectivityManager != null)
    {
        NetworkInfo netInfo = connectivityManager.getActiveNetworkInfo();
        if (netInfo != null && netInfo.isConnected())
        {
            return true;
        }
    }
    return false;
}
1
vikas singh

ConnectivityManager ne pourra pas vous dire si vous avez une connexion active sur WIFI.

La seule option pour vérifier si nous avons une connexion Internet active est d'envoyer une requête ping à l'URL. Mais vous n'avez pas besoin de le faire avec chaque demande HTTP que vous avez faite depuis votre application.

Ce que tu peux faire:

  1. Utilisez le code ci-dessous pour vérifier la connectivité

    private boolean checkInternetConnection()
    {
        ConnectivityManager cm = (ConnectivityManager) 
        getSystemService(Context.CONNECTIVITY_SERVICE);
        // test for connection
        if (cm.getActiveNetworkInfo() != null
            && cm.getActiveNetworkInfo().isAvailable()
            && cm.getActiveNetworkInfo().isConnected())
        {
            return true;
        }
        else
        {
            return false;
        }
    }
    
  2. Et tout en faisant un appel de repos en utilisant le délai d'expiration du client HTTP comme 10 secondes. Si vous n'obtenez pas de réponse dans les 10 secondes, cela signifie que vous n'avez pas de connexion Internet active et qu'une exception sera levée (la plupart du temps, vous obtenez une réponse dans les 10 secondes). Pas besoin de vérifier la connexion active en envoyant un ping à chaque fois (si vous ne faites pas de chat ou d'application VOIP)

1
Ashish Rathee