18

Ich möchte programmgesteuert überprüfen, ob es eine Internetverbindung in Android Phone/Emulator gibt. Sobald ich sicher bin, dass eine Internetverbindung besteht, werde ich einen Anruf ins Internet machen.Wie programmatisch die Verfügbarkeit der Internetverbindung in Android überprüfen?

So ist es wie "Hey Emulator! Wenn Sie eine Internetverbindung haben, dann öffnen Sie diese Seite, sonst doSomeThingElse();"

ich hoffe, Sie bekommen die Idee. Ich würde eine schnelle Antwort sehr schätzen, ich brauche es ziemlich früh.

Antwort

2

Try this:

ConnectivityManager connec = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE); 

if(connec.getNetworkInfo(0).getState() == NetworkInfo.State.CONNECTED || connec.getNetworkInfo(1).getState() == NetworkInfo.State.CONNECTING ) { 
    text.setText("hey your online!!!")  ;    
    //Do something in here when we are connected 
} else if(connec.getNetworkInfo(0).getState() == NetworkInfo.State.DISCONNECTED || connec.getNetworkInfo(1).getState() == NetworkInfo.State.DISCONNECTED ) { 
    text.setText("Look your not online");   
} 
25

Die Methode, die ich für mich selbst implementiert:

/* 
* isOnline - Check if there is a NetworkConnection 
* @return boolean 
*/ 
protected boolean isOnline() { 
    ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); 
    NetworkInfo netInfo = cm.getActiveNetworkInfo(); 
    if (netInfo != null && netInfo.isConnected()) { 
     return true; 
    } else { 
     return false; 
    } 
} 

sich bewusst sein, dies ist ein Network-Check. Wenn es eine NetworkConnection gibt, muss es keine InternetConnection sein.

+0

Rückgabecode vereinfacht werden kann: 'Netinfo zurückkehren = null && netInfo.isConnected();! ' –

0

Da Sie mit einem Netzwerk verbunden sind garantiert nicht, dass Sie Internet haben, habe ich nur meine Anrufe in das Internet in einem Versuch catch Block gemacht. Fangen Sie dann die UnknownHostException ein, um kein Internet zu verwenden.

11

Die Verbindung mit einem Netzwerk garantiert keine Internetverbindung.

Sie könnten mit dem WLAN Ihres Hauses verbunden sein, aber Sie haben möglicherweise keine Internetverbindung. Oder Sie befinden sich in einem Restaurant, in dem Sie mit dem WLAN verbunden sein können, aber das Passwort für den Hotspot benötigen, um das Internet nutzen zu können. In solchen Fällen werden die oben genannten Methoden wahr, aber das Gerät wird nicht über Internet verfügen, und wenn nicht mit den richtigen Versuch und Fänge umgeben, könnte die App abstürzen.

Fazit, Netzwerkkonnektivität bedeutet nicht Internetkonnektivität, es bedeutet lediglich, dass die drahtlose Hardware Ihres Geräts eine Verbindung zu einem anderen Host herstellen kann und beide eine Verbindung herstellen können.

Unten ist eine Methode, die überprüfen kann, ob das Gerät eine Verbindung zu einer Website herstellen kann, und gibt eine Antwort entsprechend zurück.

if (networkConnectivity()) 
{ 
    try 
    { 
     HttpURLConnection urlc = (HttpURLConnection) (new URL("http://www.anywebsiteyouthinkwillnotbedown.com").openConnection()); 
     urlc.setRequestProperty("User-Agent", "Test"); 
     urlc.setRequestProperty("Connection", "close"); 
     urlc.setConnectTimeout(3000); //choose your own timeframe 
     urlc.setReadTimeout(4000); //choose your own timeframe 
     urlc.connect(); 
     networkcode2 = urlc.getResponseCode(); 
     return (urlc.getResponseCode() == 200); 
    } catch (IOException e) 
    { 
     return (false); //connectivity exists, but no internet. 
    } 
} else 
{ 
    return false; //no connectivity 
} 
+0

Können Sie Erläuterungen zu Ihrem Code geben? Warum richten Sie diese Anforderungseigenschaften ein? Ist dies ein geeigneter Weg, die Internetverbindung für sehr langsame/schwache Verbindungen zu überprüfen, die die Datenübertragung zur Überprüfung der Verbindungsverfügbarkeit minimieren? – remi

+0

@remi. es sollte gut funktionieren. kann keinen Grund sehen, nicht zu. habe es nicht auf sehr langsamen Verbindungen tho getestet. – tony9099

+0

Es funktioniert, aber es besteht das Risiko, dass die DNS-Anfrage in dieser Lösung hängen bleibt. Das Gerät versucht, die Webadresse aufzulösen und erreicht möglicherweise nicht den DNS-Server selbst. –

5

wie für die Frage Titel, können Sie den Internetzugang überprüfen möchten,

so der schnellste Weg, und es ist zumindest effizient für jetzt,

thnx zu levit auf der Grundlage seiner Antwort https://stackoverflow.com/a/27312494/3818437

Wenn Sie nur nach einer Verbindung zu einem Netzwerk suchen möchten - egal wenn Internet verfügbar ist - dann die meisten der swers hier (einschließlich der akzeptierten), wird die Implementierung von isConnectedOrConnecting() gut funktionieren. Wenn Sie wissen wollen, ob Sie eine Internetverbindung haben (wie die Frage Titel angibt) auf Ping lesen Sie bitte für den Hauptnamen Server

public boolean isOnline() { 

    Runtime runtime = Runtime.getRuntime(); 
    try { 

     Process ipProcess = runtime.exec("/system/bin/ping -c 1 8.8.8.8"); 
     int  exitValue = ipProcess.waitFor(); 
     return (exitValue == 0); 

    } catch (IOException e)   { e.printStackTrace(); } 
     catch (InterruptedException e) { e.printStackTrace(); } 

    return false; } 

Das ist es! Ja, das ist kurz, ja, es ist schnell, nein, es muss nicht im Hintergrund laufen, nein, Sie brauchen keine Root-Rechte.

Mögliche Fragen

Ist das schnell genug, um wirklich?

Ja, sehr schnell!

Gibt es wirklich keine zuverlässige Möglichkeit zu überprüfen, ob Internet verfügbar ist, andere als etwas im Internet zu testen?

Nicht so weit ich weiß, aber lass es mich wissen, und ich werde meine Antwort bearbeiten.

Konnte ich nicht einfach meine eigene Seite pingen, die ich sowieso anfragen möchte?

Sicher! Sie könnten sogar beide prüfen, wenn Sie unterscheiden zwischen "Internetverbindung verfügbar" und Ihre eigenen Server erreichbar sein möchten

Was passiert, wenn der DNS ist ausgefallen?

Google DNS (z. B. 8.8.8.8) ist der größte öffentliche DNS-Dienst in der Welt. Ab 2013 bedient es 130 Milliarden Anfragen pro Tag. Lassen Sie uns nur sagen, Ihre App würde wahrscheinlich nicht die Rede von der Tag sein.

Welche Berechtigungen sind erforderlich?

Nur Internetzugang - was für eine Überraschung ^^ (? Btw haben Sie jemals darüber nachgedacht, , wie einige der hier vorgeschlagenen Methoden auch einen Remote-Kleber über die availablility von Internet haben könnten, ohne diese Erlaubnis)

3

ich habe diese beiden Methoden wurden unter Verwendung von Internet-Status zu überprüfen manchmal https Protokoll versuchen nicht funktioniert http Protokoll

// Check if network is available 
public static boolean isNetworkAvailable() { 
    ConnectivityManager cm = (ConnectivityManager) 
      AppGlobals.getContext().getSystemService(Context.CONNECTIVITY_SERVICE); 
    NetworkInfo networkInfo = cm.getActiveNetworkInfo(); 
    return networkInfo != null && networkInfo.isConnected(); 
} 

// ping the google server to check if internet is really working or not 
public static boolean isInternetWorking() { 
    boolean success = false; 
    try { 
     URL url = new URL("https://google.com"); 
     HttpURLConnection connection = (HttpURLConnection) url.openConnection(); 
     connection.setConnectTimeout(10000); 
     connection.connect(); 
     success = connection.getResponseCode() == 200; 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    return success; 
} 
0

Aus meiner OLD Answer here

Probieren Sie diese

ich die Lösung zur Verfügung gestellt von @Levit angewendet haben und Funktion erstellt, die die zusätzlichen HTTP-Anforderung nicht nennen.

Es löst den Fehler Unable to Resolve Host

public static boolean isInternetAvailable(Context context) { 
    ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); 
    NetworkInfo activeNetwork = cm.getActiveNetworkInfo(); 
    if (activeNetwork == null) return false; 

    switch (activeNetwork.getType()) { 
     case ConnectivityManager.TYPE_WIFI: 
      if ((activeNetwork.getState() == NetworkInfo.State.CONNECTED || 
        activeNetwork.getState() == NetworkInfo.State.CONNECTING) && 
        isInternet()) 
       return true; 
      break; 
     case ConnectivityManager.TYPE_MOBILE: 
      if ((activeNetwork.getState() == NetworkInfo.State.CONNECTED || 
        activeNetwork.getState() == NetworkInfo.State.CONNECTING) && 
        isInternet()) 
       return true; 
      break; 
     default: 
      return false; 
    } 
    return false; 
} 

private static boolean isInternet() { 

    Runtime runtime = Runtime.getRuntime(); 
    try { 
     Process ipProcess = runtime.exec("/system/bin/ping -c 1 8.8.8.8"); 
     int exitValue = ipProcess.waitFor(); 
     Debug.i(exitValue + ""); 
     return (exitValue == 0); 
    } catch (IOException | InterruptedException e) { 
     e.printStackTrace(); 
    } 

    return false; 
} 

es nun wie nennen,

if (!isInternetAvailable(getActivity())) { 
    //Show message 
} else { 
    //Perfoem the api request 
} 
+0

Ich teste auf Android-Gerät und dieser Code es steckt – Ricardo

+0

was ist "/ system/bin/ping -c 1 8.8.8.8"? – TheLearner