2016-05-05 14 views
1

ich eine Methode benötigen, um zu überprüfen, ob mein Netzwerk internem conected, und während meiner Forschungen fand ich eine Methode beschreibt unter:überprüfen Sie, ob das Gerät mit Internet verbunden ist, nicht nur mit Netzwerk

public static boolean hasInternetAccess(Context context) { 
    if (isNetworkAvailable(context)) { 
     try { 
      HttpURLConnection urlc = (HttpURLConnection) 
       (new URL("http://clients3.google.com/generate_204") 
       .openConnection()); 
      urlc.setRequestProperty("User-Agent", "Android"); 
      urlc.setRequestProperty("Connection", "close"); 
      urlc.setConnectTimeout(1500); 
      urlc.connect(); 
      return (urlc.getResponseCode() == 204 && 
         urlc.getContentLength() == 0); 
     } catch (IOException e) { 
      Log.e(TAG, "Error checking internet connection", e); 
     } 
    } else { 
     Log.d(TAG, "No network available!"); 
    } 
    return false; 
} 

... aber meine Programme werden auf China verteilt und Google ist in China blockiert.

Ich habe mir vorgenommen, eine Methode wie diese zuerst meine Lokalisierung zu erstellen, um eine Baidoo-Website - wie Google auf China - zu bekommen, aber dies ist sehr expansive Methode zu überprüfen, ob Gerät in einem Netzwerk verbunden ist und überprüfen, ob als im Internet verbunden.

+0

Senden Sie eine HEAD-Anfrage an eine beliebige Seite und sehen Sie, ob Sie eine Antwort erhalten. Oder versuchen Sie es mit Ping. – tynn

+0

Für China wäre das wahrscheinlich am einfachsten etwas wie 'InetAddress.getByName (" baidu.com "). IsReachable (TIMEOUT_IN_MILLISECONDS);' und prüfen, ob es eine Ausnahme auslöst. – ccpizza

Antwort

1

Man könnte so etwas wie dies versuchen ConnectivityManager mit:

public static boolean isConnectedToInternet(Context context){ 
     boolean isConnected= false; 
     ConnectivityManager connectivityManager = (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE); 
     NetworkInfo wifi = connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI); 
     NetworkInfo mobile = connectivityManager .getNetworkInfo(ConnectivityManager.TYPE_MOBILE);   
     isConnected= (wifi.isAvailable() && wifi.isConnectedOrConnecting() || (mobile.isAvailable() && mobile.isConnectedOrConnecting())); 
     return isConnected; 
    } 

Sie auch die ausgewählten Antworten überprüfen here und here

+0

ishmaelMakitla seine Antwort nicht Er erwartet, bitte lesen Sie die Frage –

+0

Maheshwar Ligade, ich überprüft - ich dachte, er sagte, "HTTP-Anfrage senden" ist teuer und wollte eine Möglichkeit zu überprüfen, ob es Internet/Datenverbindung ist. Ich sehe in Ihrer vorgeschlagenen Antwort, dass Sie ein HTTP-GET an Yahoo senden - während ich in meinem Fall Connectivity Manager verwende, um zu überprüfen, ob das Gerät selbst mit dem Internet verbunden ist, ohne eine Anfrage zu stellen. Habe ich vielleicht etwas verpasst? Danke für den Kommentar. – ishmaelMakitla

+0

"Überprüfen Sie, ob das Gerät mit dem Internet verbunden ist." Er möchte, dass dieses Netzwerk nicht verbunden ist oder nicht, das durch Ihren Code gegeben wird. –

0

Verwenden Sie die Inet-Adresse zu überprüfen Konnektivität verfügbar ist oder nicht unter Code.

Beispielcode

public static void isNetworkAvailable(Context context){ 
    HttpGet httpGet = new HttpGet("http://www.yahoo.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"); 
} 
+0

Der obige Code macht das gleiche von meinem. Das sieht nur anders aus. –

0

China does haben Websites android apps zu hosten. China hat proxy servers Sie könnten verwenden, um zu sehen, was blockiert ist und könnte verwendet werden, um zu verhindern, welche Firewall China hat. Ich rate Ihnen dringend, rechtliche Konsequenzen in Betracht zu ziehen. TCP/IP-Dienstprogramme oder sogar ein Browser können zum Testen einer Verbindung verwendet werden. Ich bin mir nicht sicher, ob ich deine Frage vollständig verstanden habe. Sie haben Android-Apps, die auf Geräten in China verwendet werden, und einen Server, der sich irgendwo befindet, wo Sie eine Verbindung testen möchten. China hat web hosting, wenn Sie diese Route gehen wollen. Benötigen Sie Zugriff auf Google APIs?

+0

Nein, ich brauche noch keine Google APIs, aber ich habe mehr von einem Server und einen Dienst, der auf einen schnelleren Server umleitet. Einer dieser Server ist in China lokalisiert, aber Chineze Server ist nicht besser und manchmal ist er kaputt. Wenn dies geschieht, versucht die Software, andere Server zu verbinden, aber nur weil Proxy und Firewalls, der Umleitungs-Flow langsam und Zeitüberschreitungs-Probleme häufig auftraten! –