Comment vérifier l'accès à internet sur Android? InetAddress n'arrive jamais à expiration
J'ai eu un AsyncTask
qui est censé vérifier l'accès au réseau à un nom d'hôte. Mais le doInBackground()
n'est jamais dépassé. Quelqu'un a une idée?
public class HostAvailabilityTask extends AsyncTask<String, Void, Boolean> {
private Main main;
public HostAvailabilityTask(Main main) {
this.main = main;
}
protected Boolean doInBackground(String... params) {
Main.Log("doInBackground() isHostAvailable():"+params[0]);
try {
return InetAddress.getByName(params[0]).isReachable(30);
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return false;
}
protected void onPostExecute(Boolean... result) {
Main.Log("onPostExecute()");
if(result[0] == false) {
main.setContentView(R.layout.splash);
return;
}
main.continueAfterHostCheck();
}
}
- Pour vérifier la présence d'une connexion internet, probablement le moyen le plus fiable serait de ping l'un des principaux serveurs de noms, ce qui pourrait être fait par exemple avec
if(Runtime.getRuntime().exec("/system/bin/ping -c 1 8.8.8.8").waitFor()==0) ...
. Voir ma réponse pour une meilleure mise en œuvre de cette. Btw la accepté de répondre (et beaucoup d'autres ici) il suffit de cocher pour un connexion réseau, pas sur internet. - voir-> stackoverflow.com/a/4239019/1815624
- Ne pas utiliser la table de ping méthode, utilisez un HTTP vérifier à la place. ICMP est bloqué sur certains réseaux, de sorte que le ping ne fonctionne pas. E. g.: il fonctionne parfaitement sur mon wifi à la maison, mais il ne fonctionne pas quand je suis à l'aide de données mobiles sur Vodafone réseau (en Hongrie). Ou combiner les 2 méthodes comme un secours, mais être prudent, car waitFor() doit attendre environ 20 secondes, même si -w -W est utilisé.
- Découvrez ceci: stackoverflow.com/a/39766506/3806413
- Encore mieux serait de s'attaquer à la couche tcp. Ce qui devrait vous conduire à proximité de la vitesse d'un ICMP, avec la fiabilité d'une requête HTTP. J'ai édité le "ping réponse" en conséquence.
Vous devez vous connecter pour publier un commentaire.
Connexion réseau /accès Internet
isConnectedOrConnecting()
(utilisé dans la plupart des réponses) vérifie pour tout réseau connexionUn Ping d'un Serveur (facile)
+
pourrait exécuter sur le thread principal-
ne fonctionne pas sur certains appareils anciens (Galays S3, etc.), il bloque, si l'internet n'est disponible.B) pour la connexion à un Socket sur Internet (avancé)
+
très rapide (de toute façon), fonctionne sur tous les appareils, très fiable-
ne peut pas s'exécuter sur le thread de l'INTERFACE utilisateurCela fonctionne de manière très fiable, sur tous les appareils, et est très rapide. Qu'il doit exécuter dans un autre bien que la tâche (p. ex.
ScheduledExecutorService
ouAsyncTask
).Questions Possibles
Est-il vraiment assez rapide?
Oui, très vite 😉
Est-il pas de moyen fiable de vérifier l'internet, d'autres à faire que de tester quelque chose sur internet?
Pas pour autant que je sais, mais laissez-moi savoir, et je vais éditer ma réponse.
Que si le serveur est en panne?
Google DNS (par exemple,
8.8.8.8
) est le plus grand public DNS dans le monde. En 2013, il a servi à 130 milliards de requêtes par jour. Laissez 's juste de dire, votre application ne serait probablement pas être le sujet de conversation du jour.Quelles autorisations sont nécessaires?
Un simple accès à internet - surprise ^^ (d'ailleurs avez-vous jamais pensé, comment certaines des méthodes proposées ici pourraient même avoir une télécommande de la colle sur l'accès à internet, sans cette autorisation?)
Supplémentaire: One-shot
AsyncTask
ExempleSupplémentaire: One-shot
RxJava/RxAndroid
Exemple (Kotlin)The ping utility exits with one of the following values: (0) At least one response was heard from the specified host. (2) The transmission was successful but no responses were received. (any other value) An error occurred. These values are defined in <sysexits.h>.
... en bref, il signifie que le ping, mais le serveur n'a pas répondu, ou en d'autres termes: pas de connexion internet (Si le périphérique que vous essayez ceci sur est connecté à internet: Avez-vous mis le android.la permission.INTERNET permission?)android.com
utilise la commande ping comme exemple dans developer.android.com/reference/java/lang/Process.html . L'émulateur de blocage, cela fait sens, mais d'autres que ça a plutôt bien fonctionné pour moi jusqu'à présent; et semble être le seul moyen fiable de vérifier ... Aussi, si vous en connaissez d'autres, je serai heureux de modifier ma réponse en conséquence./system/bin/ping -i 0.2 -c 1 8.8.8.8
, qui attend maintenant de 0,2 secondes après la demande, au lieu de la valeur par défaut de 1 seconde (des valeurs inférieures à celles de 200ms ne sont autorisés que pour des super-utilisateurs). En dehors de cela vous pouvez aussi construire votre propre délai d'attente de la routine. L'avoir sur un autre thread serait généralement la première étape si. À partir de là, vous pouvez envoyer des commentaires après un certain temps, dans le cas où la requête ping n'était pas encore fini, par exemple.google.com
par exemple, (et le port 80 pour le support de l'approche). Dans ce cas, vous êtes en s'appuyant sur les DNS de travailler aussi bien (en fonction de votre cas d'utilisation, cela pourrait être exactement ce que vous voulez de toute façon).isReachable(URL, PORT)
-méthode donnée par les extraits de la réponse - c'est assez facile à accomplir. Même si malheureusement ce n'est pas totalement intuitive/déjà mis en œuvre.Si l'appareil est en mode avion (ou sans doute dans d'autres situations où il n'y a pas de réseau disponible),
cm.getActiveNetworkInfo()
seranull
, si vous avez besoin d'ajouter unnull
vérifier.Modifié (Eddie solution) ci-dessous:
Également ajouter l'autorisation suivante à l'
AndroidManifest.xml
:Un autre petit point, si vous avez absolument besoin d'une connexion réseau au moment donné dans le temps, alors il peut être préférable d'utiliser
netInfo.isConnected()
plutôt quenetInfo.isConnectedOrConnecting
. Je suppose que c'est à l'individu de cas d'utilisation cependant.context.getSystemService
ou il ne fonctionne pas. J'ai eu mon idée ici androidhive.info/2012/07/...Pas besoin d'être complexe. Le plus simple et le cadre façon est d'utiliser
ACCESS_NETWORK_STATE
autorisation et juste faire un connecté méthodeVous pouvez également utiliser
requestRouteToHost
si vous avez un particulier de l'hôte et le type de connexion (wifi/mobile) dans l'esprit.Vous aurez également besoin de:
dans votre manifeste android.
context.getSystemService
ou il ne fonctionne pas. J'ai eu mon idée ici androidhive.info/2012/07/...Pour obtenir
getActiveNetworkInfo()
fonctionne, vous devez ajouter la ligne suivante à la manifester.vérifier ce code... cela a fonctionné pour moi 🙂
Puis-je définir le gestionnaire d':
...et lancer le test:
isNetworkAvailable(h,30000);
droit à la fin de larun()
partie du code (c'est à dire après la demande de la disponibilité du réseau, il en fait de même 30 ans plus tard. Quelques réflexions: 1) Probablement mieux de le renommer en quelque chose commeregularNetworkAvailabilityCheck()
de clarifier ce qu'il est en train de faire. 2) Vérifier/Tester pour les effets secondaires dangereux des problèmes, etc. (au moins essayer avec 3 ou 4 secondes de demandes et de voir ce qui se passe - utilisation de la mémoire, etc.) 3) éventuellement, essayez une autre page quem.google.com
(qui demande 34950 unicode caractères atm).isNetworkAvailable
était un délai d'attente, et pas un retard, .. Mieux faire quelque chose de distinct, comme ceci:private Handler mHandler = new Handler(); private Runnable mRunnable = new Runnable() { @Override public void run() { isNetworkAvailable(h, 2000); mHandler.postDelayed(this, 30000); }};
et aussi le coup de pied de avec quelque chose commemHandler.postDelayed(mRunnable, 30000);
Prendre un coup d'oeil à la ConnectivityManager classe. Vous pouvez utiliser cette classe pour obtenir des informations sur les connexions actives sur un ordinateur hôte. http://developer.android.com/reference/android/net/ConnectivityManager.html
EDIT: Vous pouvez utiliser
ou
et d'analyser les DetailedState enum de retour de la NetworkInfo objet
EDIT EDIT: Pour savoir si vous pouvez accéder à un ordinateur hôte, vous pouvez utiliser
Évidemment, je suis en utilisant le Contexte.getSystemService(Context.CONNECTIVITY_SERVICE) en tant que proxy pour dire
Trouvé et modifié (!) à partir de ce lien :
Dans votre fichier de manifeste d'ajouter au moins:
Vous avez probablement déjà l'INTERNET permission si vous y accédez. Ensuite, une fonction booléenne qui permet de tester la connectivité est:
cm.getActiveNetworkInfo().isAvailable()
semble redondant.J'ai fait ce code, c'est le plus simple et il est juste un booléen.
en demandant
if(isOnline()){
S'il y a une connexion et si il peut se connecter à une page sur le code de statut
200
(connexion stable).Assurez-vous d'ajouter le bon
INTERNET
etACCESS_NETWORK_STATE
autorisations.Il ne fonctionne pour moi:
Pour vérifier la disponibilité du réseau:
Pour vérifier l'accès à internet:
Il n'y a plus d'une façon
Première, la plus courte, mais Inefficace façon
Réseau de l'Autorisation de l'État requis uniquement
Cette méthode,
Comme on le voit dans les réponses
ConnectivityManager
est une solution, j'ai juste ajouté ça à l'intérieur d'une méthode c'est une méthode simplifiée de tous les utiliserConnectivityManager
retourne vrai si il existe un réseau d'accès pas d'accès à Internet, signifie que si votre WiFi est connecté à un routeur, mais le routeur n'a pas internet elle renvoie true, c'vérifier la disponibilité de la connexionDeuxième, de manière Efficace
État du réseau et de l'Internet des Autorisations nécessaires
Puis cette classe,
Appel
CheckInternetAsyncTask
Quelques Explications :-
vous devez vérifier sur Internet
AsyncTask
, sinon, il peut jeterandroid.os.NetworkOnMainThreadException
, dans certains cas,ConnectivityManager
utilisé pour vérifier l'accès au réseau si la valeur est true envoie une requête (Ping)Demande d'envoyer à
http://clients3.google.com/generate_204
, Cette URL est connue pour revenir à une page vide avec un statut HTTP 204 c'est plus rapide et plus efficace quehttp://www.google.com
, lire cette. si vous avez le site il est préférable de mettre votre site à la place de google, seulement si vous l'utilisez dans l'applicationDélai peut être modifié gamme (20ms -> 2000ms), 1500ms est couramment utilisé
De tout ce que j'ai vu jusqu'à présent la plus courte et la meilleure façon devrait être:
PS: Ce n'est pas exécutée sur n'importe quel hôte, il vérifie juste la connectionstatus, donc si votre routeur n'a pas de connexion internet et que votre appareil est connecté à cette méthode retourne vrai bien que vous n'avez pas internet.
Pour un test, je recommanderais execuding un HttpHead demande (p. ex. http://www.google.com) et de vérifier l'état, si son 200 OK tout va bien et que votre appareil dispose d'une connexion internet.
Voici la méthode que j'utilise:
Encore mieux, assurez-vous qu'il est "connecté":
Ici est de savoir comment utiliser la méthode:
D'autorisation nécessaire:
https://stackoverflow.com/a/16124915/950427
Un important cas d'utilisation sur des appareils mobiles afin de garantir une connexion existe. C'est un problème courant lors d'un mobile utilisateur entre un réseau Wifi avec un "Portail Captif", dans laquelle ils ont besoin de se connecter. J'utilise cette fonction de blocage à l'arrière-plan afin d'assurer une connexion existe.
Vous pouvez parcourir toutes les connexions réseau et vérifier s'il existe au moins une connexion disponibles:
Pour moi, c'était pas une bonne pratique pour vérifier l'état de la connexion dans l'Activité de classe, parce que
devrait être appelé là-bas, ou vous avez besoin de pousser vers le bas de votre Activité instance (contexte) pour le gestionnaire de connexion de la classe afin de pouvoir vérifier l'état de la connexion, il y
Lorsqu'aucune connexion disponible (wifi, réseau), j'ai attraper le UnknownHostException exception:
De cette façon, je peux gérer ce cas avec les autres cas de la même classe (mon serveur toujours la réponse de retour avec une chaîne json)
Ça fonctionne pour moi. L'essayer.
Im en utilisant ce code à la place de la InetAddress :
Il n'est pas complexe à vérifier Android de réseau /internet état de la connectivité. Ci-dessous
DetectConnection
classe va vous aider à vérifier ce statut:Pour plus de détails, visitez
Comment Vérifier Android de Réseau /Internet État de la Connectivité
Meilleure approche:
Voici le code de mon
Utils
classe:Vous pouvez utiliser cette méthode pour détecter la disponibilité du réseau-
J'ai appliqué la solution proposée par @Levit et créé fonction qui n'ira pas en appel de la Requête Http.
Il permettra de résoudre l'erreur
Unable to Resolve Host
Maintenant l'appeler comme,
Autres réponses que l'utilisation ConnectivityManager sont faux parce que d'avoir un réseau de connexion ne signifie pas que vous avez accès à internet. Par exemple, l'utilisateur peut être connecté à un café WiFi de portail, mais ne peut pas accéder à internet. Pour vérifier que l'internet est accessible, vous devez essayer de se connecter à un serveur réel. Normalement, lorsque vous voulez faire cela, vous disposez d'un serveur spécifique à l'esprit que vous souhaitez vous connecter, donc aller de l'avant et de vérifier si vous pouvez vous connecter à ce serveur. Voici une méthode simple pour vérifier la connectivité à un serveur.
La raison pour le réglage de la ConnectTimeout est que, sinon, la valeur par défaut est le timeout TCP qui peuvent être plusieurs longues secondes.
Note également que Android ne vous laisseront pas de l'exécuter sur votre thread principal.
Cette méthode vous donne la possibilité de vraiment une méthode rapide (pour des commentaires en temps réel) ou une méthode plus lente (pour un arrêt des contrôles qui nécessitent de la fiabilité)
Ce qui est couvert dans android docs
http://developer.android.com/training/monitoring-device-state/connectivity-monitoring.html
Je suis passé par toutes les réponses et je viens avec ma propre réponse, qui d'abord vérifier si Internet est disponible et si Internet est disponible, alors il vérifier si il est actif ou pas.
J'ai inclus tout le nécessaire de la méthode et des classes pour vérifier la connexion Internet active.
NetworkUtils.class
Vous pouvez vérifier si Internet est active à l'aide de code ci-dessous:
Très important de vérifier si nous avons la connectivité avec isAvailable() et si est possible d'établir une connexion avec isConnected()
et vous pouvez derterminate le type de réseau actif WiFi :
ou mobile Móvil :
n'oubliez pas les autorisations:
Il suffit de créer la classe suivante qui vérifie pour une connexion internet:
Cette classe contient une méthode qui retourne la valeur booléenne de l'état de la connexion. Donc, en termes simples, si la méthode trouve une connexion Internet, la valeur de retour est
true
, sinonfalse
si pas de connexion valide est trouvé.La méthode suivante dans le MainActivity appelle ensuite le résultat de la méthode décrite précédemment, et invite l'utilisateur à agir en conséquence:
Dans le code ci-dessus, si le résultat est faux, (donc il n'y a pas de connexion internet, l'utilisateur est pris pour le wi-fi Android panneau, où il est invité à se connecter à un hotspot wi-fi.
Mise à jour 29/06/2015
Si vous êtes à l'aide de Xamarin.Android et que vous souhaitez vérifier la connectivité, vous pouvez utiliser un package Nuget qui vous donnent cette fonctionnalité sur de multiples plateformes. Les bons candidats sont ici et ici.
[Fin de la mise à Jour]
Les Réponses ci-dessus sont très bons, mais ils sont tous en Java, et presque tous de vérifier la connectivité. Dans mon cas, j'avais besoin de disposer d'une connectivité avec un type spécifique de connexion et je suis en train d'élaborer sur Xamarin.Android. Par ailleurs, je ne passe pas une référence à mes activités de Contexte dans la couche du Matériel, j'utilise le Contexte de l'Application. Voici donc ma solution, dans le cas où quelqu'un vient ici avec des exigences similaires. Je n'ai pas fait l'essai complet, sera mise à jour de la réponse une fois que j'ai terminé avec mes tests
J'ai fait de cette manière.
Un peu plus court et plus lisible, je suppose.
Cheers!
Saiyan
utilisateur ce
C'est tellement génial d'avoir plus d'une manière de coder.
Voici mon exemple.
Bonne chance.
Si vous utilisez l'API de 23 ci-dessus, vous pouvez maintenant vérifier si oui ou non, internet est active à l'aide de NetworkCapabilities.NET_CAPABILITY_VALIDATED, qui est soutenu par de Google ping service.
Ce code va vous aider à trouver l'internet est en marche ou pas.
Aussi, vous devez fournir les autorisations suivantes
J'ai essayé avec près de 5+ différentes android approches et trouvé que c'est la meilleure solution fournie par google en particulier pour android:
C'est
faster
,efficient
etaccurate
que toute autre solution disponible.Si vous avez besoin de vérifier pour la connexion internet, utilisation de cette méthode à l'aide de la commande ping sur le serveur:
Soit vous pouvez utiliser la vérifier à l'aide du port
isNetworkAvailable
Fonction dans une autre fonction statique, mais je ne sais pas quel Paramètre de contexte à utiliser, car il est dit que la fonction doit être unstatic à utilisermyclass.this
Pouvez-vous m'aider avec mon problèmeLa plus solution la plus Simple serait de
Dans la plupart des cas, il pourra vérifier la connexion internet si il/elle veut se connecter au serveur distant afin de les simple et la meilleure solution serait de requête ping de votre serveur comme suit.
N'oubliez pas d'ajouter ce autorisations à votre manifeste :
La plupart des réponses dans ce fil de discussion seulement vérifier si il y a une connexion disponible, mais ne vérifie pas si les travaux de raccordement, d'autres réponses ne sont pas de périphérique large, ma solution devrait fonctionner sur tous les appareils.
Vous pouvez déposer mon code dans votre activité principale avant le lancement de l'application, il sera de déterminer rapidement si il y a une réelle connectivité à l'internet, si il y a la boîte de dialogue sera immédiatement supprimé et l'application sera lancée, si ce n'est une fenêtre d'alerte en disant que l'appli besoin d'une connexion internet pour travailler.
Ici est l'autorisation que vous avez besoin de :
Vous pouvez vérifier sur internet avec ci-dessous le code:
Voici quelques modernes code qui utilise un
AsynTask
pour contourner un problème où les android se bloque lorsque vous tentez de vous connecter sur le thread principal et introduit une alerte avec un rincez et répétez l'option pour l'utilisateur....
Au lieu de vérification de la connexion wi-fi ou la connexion de données Mobiles, essayez de frapper n'importe quel domaine hébergé. De sorte que, vous pouvez vérifier si le WIFI/connexion Mobile a la capacité de se connecter à Internet public.
Ci-dessous seront de retour si votre appareil mobile est capable de se connecter avec le domaine public fourni.
Espère qu'il sera utile..
Android fournit ConnectivityManager classe pour connaître l'état de la connexion internet. La méthode suivante sera très utile à savoir la connexion internet de l'état.
D'abord ajouter le INTERNET et ACCESS_NETWORK_STATE l'autorisation de AndroidManifest.xml
Puis utilisez la méthode ci-dessous pour vérifier si le périphérique est connecté à internet ou pas. Cette méthode renvoie true si l'appareil est connecté à internet.
Lien De Référence :- http://www.androidtutorialshub.com/android-check-internet-connection-status/
C'est le plus simple et le plus facile pour vérifier la connexion internet wi-fi et des données mobiles.
Ici est la méthode optimale pour la vérification de la connexion internet. Ce que cette méthode n'est à effectuer une série de vérifications "le téléphone est-il pas en mode avion, le téléphone est connecté à un réseau, etc". Si tous les contrôles de retourner la valeur true, la méthode sera alors télécharger un fichier à partir d'internet et de voir si le contenu correspond à la valeur attendue.
Les avantages de cette méthode par rapport à d'autres méthodes que de faire un ping vers le serveur pour vérifier la connexion internet sont:
Android runtime varie sur différents téléphones, donc vous ne pouvez pas toujours être en mesure d'exécuter ces commandes, comme illustré ici: Pourquoi ne ping fonctionne sur certains appareils, et pas d'autres?
Ping un serveur ne fonctionne pas toujours parce que des pages de connexion/ré-oriente sur des réseaux wifi qui peut donner la fausse impression d'une connexion.
Cette réponse est écrite dans Kotlin et utilise le De carburant bibliothèque de télécharger un fichier à partir d'internet avec la méthode
fetchUrlAsString
, mais n'importe quelle bibliothèque peuvent être remplacés aussi longtemps que vous vous assurez que votre requête HTTP n'est pas mis en cache. Pensez àshowConnectionWarning()
ethideConnectionWarning()
comme équivalent àinternet connection status = false
etinternet connection status = true
respectivement.Vous aurez besoin des autorisations suivantes:
Ici est la Kotlin version que j'utilise pour la vérification de l'accessibilité,
Kotlin MyReachability
Vous pouvez même passer de la
REACHABILITY_SERVER
comme param basés sur les politiques et les restrictions, par exemple lorsque vous êtes en chine, vous pouvez vérifier https://baidu.com plutôt https://google.com.Appelant exemple,
Autorisations Android
N'oubliez pas d'ajouter ces ci-dessous les autorisations de votre
AndroidManifest.xml
Dans kotlin:
Invoquer isConnected à l'intérieur de l'Activité de classe:
À l'intérieur fragment de classe: