2013-07-18 10 views
12

Ich versuche, ein Teil in meiner App zu schreiben, die zwischen einer aktiven Wifi-Verbindung und einer tatsächlichen Verbindung mit dem Internet unterscheiden wird. Die Frage, ob es eine aktive WLAN-Verbindung gibt, ist mit dem Verbindungsmanager ziemlich einfach. Jedes Mal, wenn ich versuche, zu testen, ob ich eine Verbindung zu einer Website herstellen kann, aber keine Internetverbindung besteht, lande ich in einer Endlosschleife.
ich ping google versucht haben, jedoch endet diese die gleiche Art und Weise nach oben:Suchen Sie nach Active Internetverbindung Android

Process p1 = java.lang.Runtime.getRuntime().exec("ping -c 1 www.google.com"); 
int returnVal = 5; 
try { 
    returnVal = p1.waitFor(); 
} catch (InterruptedException e) { 
    e.printStackTrace(); 
} 
boolean reachable = (returnVal==0); 
return reachable; 

Ich habe auch versucht, diesen Code:

if (InetAddress.getByName("www.xy.com").isReachable(timeout)) 
{ } 
else 
{ } 

aber ich konnte nicht isReachable zu arbeiten.

+0

Überprüfen Sie die Frage https://StackOverflow.com/questions/4238921/detect-Whether-there-is-anInternet-connection-available-on-android – nyulan

Antwort

10

Ich benutze diese:

public static void isNetworkAvailable(Context context){ 
    HttpGet httpGet = new HttpGet("http://www.google.com"); 
    HttpParams httpParameters = new BasicHttpParams(); 
    // Set the timeout in milliseconds until a connection is established. 
    // The default value is zero, that means the timeout is not used. 
    int timeoutConnection = 3000; 
    HttpConnectionParams.setConnectionTimeout(httpParameters, timeoutConnection); 
    // Set the default socket timeout (SO_TIMEOUT) 
    // in milliseconds which is the timeout for waiting for data. 
    int timeoutSocket = 5000; 
    HttpConnectionParams.setSoTimeout(httpParameters, timeoutSocket); 

    DefaultHttpClient httpClient = new DefaultHttpClient(httpParameters); 
    try{ 
     Log.d(TAG, "Checking network connection..."); 
     httpClient.execute(httpGet); 
     Log.d(TAG, "Connection OK"); 
     return; 
    } 
    catch(ClientProtocolException e){ 
     e.printStackTrace(); 
    } 
    catch(IOException e){ 
     e.printStackTrace(); 
    } 

    Log.d(TAG, "Connection unavailable"); 
} 

Es stammt aus einer anderen Antwort, aber Stackoverflow kann ich es nicht finden.

EDIT:

Schließlich fand ich es: https://stackoverflow.com/a/1565243/2198638

+0

Was passiert, wenn ich timeoutConnection = 2000 und int timeoutSocket = 3000; –

2

Abfrage eine Website wie folgt aus:

Machen Sie Ihre Klasse AsyncTaskCompleteListenere<Boolean> implementieren, indem Sie die folgende Methode zur Klasse hinzufügen:

@Override 
public void onTaskComplete(Boolean result) { 
    Toast.makeText(getApplicationContext(), "URL Exist:" + result, Toast.LENGTH_LONG).show(); 
    // continue your job 
} 

Fügen Sie eine einfache testConnection Methode zu Ihrer Klasse hinzu, die aufgerufen werden soll, wenn Sie nach Ihrem Con suchen möchten Konnektivität:

public void testConnection() { 
     URLExistAsyncTask task = new URLExistAsyncTask(this); 
     String URL = "http://www.google.com"; 
     task.execute(new String[]{URL}); 
    } 

Und schließlich die URLExistAsyncTask Klasse, die den Verbindungstest als asynchrone (Hintergrund) Aufgabe ausführen und ruft Ihre onTaskComplete Methode einmal getan zurück:

public class URLExistAsyncTask extends AsyncTask<String, Void, Boolean> { 
     AsyncTaskCompleteListenere<Boolean> callback; 

     public URLExistAsyncTask(AsyncTaskCompleteListenere<Boolean> callback) { 
      this.callback = callback; 
     } 

     protected Boolean doInBackground(String... params) { 
      int code = 0; 
      try { 
       URL u = new URL(params[0]); 
       HttpURLConnection huc = (HttpURLConnection) u.openConnection(); 
       huc.setRequestMethod("GET"); 
       huc.connect(); 
       code = huc.getResponseCode(); 
      } catch (IOException e) { 
       return false; 
      } catch (Exception e) { 
       return false; 
      } 

      return code == 200; 
     } 

     protected void onPostExecute(Boolean result){ 
       callback.onTaskComplete(result); 
     } 
    } 
23

Es tut funktioniert für mich:

Zur Überprüfung der Netzwerkverfügbarkeit:

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

Internetzugang zu überprüfen:

public Boolean isOnline() { 
    try { 
     Process p1 = java.lang.Runtime.getRuntime().exec("ping -c 1 www.google.com"); 
     int returnVal = p1.waitFor(); 
     boolean reachable = (returnVal==0); 
     return reachable; 
    } catch (Exception e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    return false; 
} 
+2

Warnung mit der Ping-Methode! Dies funktioniert auf den meisten Geräten, die ich getestet habe, aber auf S4 Mini wird es nicht funktionieren. –

+0

Es funktioniert nicht in 4.3 Geräten ... @ JohnSmith – Josh

3

Um zu überprüfen, ob das Android-Gerät eine aktive Verbindung aufweist, verwende ich diese hasActiveInternetConnection() Methode unter dass (1) versucht, zu erkennen, ob Netzwerk verfügbar ist, und (2) dann eine Verbindung an google.com, um festzustellen, ob das Netzwerk aktiv ist.

public static boolean hasActiveInternetConnection(Context context) { 
     if (isNetworkAvailable(context)) { 
      if (connectGoogle()) { 
       return true; 
      } else {//one more try 
       return connectGoogle(); 
      } 

     } 
else 
{ 
      log("No network available! (in hasActiveInternetConnection())"); 
      return false; 
     } 
    } 


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


    public static boolean connectGoogle() { 
     try { 
      HttpURLConnection urlc = (HttpURLConnection)(new URL("http://www.google.com").openConnection()); 
      urlc.setRequestProperty("User-Agent", "Test"); 
      urlc.setRequestProperty("Connection", "close"); 
      urlc.setConnectTimeout(10000); 
      urlc.connect(); 
      return (urlc.getResponseCode() == 200); 

     } catch (IOException e) { 
      log("IOException in connectGoogle())"); 
      return false; 
     } 
    } 
3

Hier sind einige moderne Code, der eine AsynTask verwendet, um ein Problem zu bekommen, wo Android stürzt ab, wenn Sie auf dem Haupt-Thread versuchen und anschließen und stellt eine Warnmeldung mit einer Spül- und wiederholen Option für den Benutzer.

class TestInternet extends AsyncTask<Void, Void, Boolean> { 
    @Override 
    protected Boolean doInBackground(Void... params) { 
     try { 
      URL url = new URL("http://www.google.com"); 
      HttpURLConnection urlc = (HttpURLConnection) url.openConnection(); 
      urlc.setConnectTimeout(3000); 
      urlc.connect(); 
      if (urlc.getResponseCode() == 200) { 
       return true; 
      } 
     } catch (MalformedURLException e1) { 
      // TODO Auto-generated catch block 
      e1.printStackTrace(); 
      return false; 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
      return false; 
     } 
     return false; 
    } 

    @Override 
    protected void onPostExecute(Boolean result) { 
     if (!result) { // code if not connected 
      AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this); 
      builder.setMessage("An internet connection is required."); 
      builder.setCancelable(false); 

      builder.setPositiveButton(
        "TRY AGAIN", 
        new DialogInterface.OnClickListener() { 
         public void onClick(DialogInterface dialog, int id) { 
          dialog.cancel(); 
          new TestInternet().execute(); 
         } 
        }); 


      AlertDialog alert11 = builder.create(); 
      alert11.show(); 
     } else { // code if connected 
      doMyStuff(); 
     } 
    } 
} 

...

new TestInternet().execute(); 
+0

Das ist gut, aber mit einer WiFi-Verbindung ohne Internetzugang wird es eine lange Zeit dauern, gibt es eine Workaround? –

-1

habe ich diese Methode verwenden. Es hat für mich funktioniert! Für Leute, die das echte Internet bekommen wollen!

public boolean isOnline() { 
    try { 
     HttpURLConnection httpURLConnection = (HttpURLConnection)(new URL("http://www.google.com").openConnection()); 
     httpURLConnection.setRequestProperty("User-Agent", "Test"); 
     httpURLConnection.setRequestProperty("Connection", "close"); 
     httpURLConnection.setConnectTimeout(10000); 
     httpURLConnection.connect(); 
     return (httpURLConnection.getResponseCode() == 200); 
    } catch (IOException e) { 
     e.printStackTrace(); 
     return false; 
    } 
} 

Für diese Methode jedes Mal! Verwenden Sie einfach einen Empfänger und =>

httpURLConnection.getResponseCode() == 200 

Dies bedeutet, dass das Internet angeschlossen ist!

+1

Um diese Antwort zu verbessern, würde ich bemerken, dass 'connect' nicht vom Haupt-Thread aufgerufen werden kann und dass es auch' setReadTimeout' sinnvoll wäre. – LordParsley