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?
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
}
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
{ }
Le premier problème que vous devez préciser est ce que vous entendez par whether internet is available
?
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.
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.
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;
}
// *** 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;
}
}
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;
}
}
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;
}
}
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;
}
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:
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;
}
}
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)