723 Stimmen

Wie prüft man den Internetzugang auf Android? InetAddress schaltet nie ab

Ich habe eine AsyncTask das den Netzzugang zu einem Hostnamen überprüfen soll. Aber die doInBackground() ist nie zeitlich begrenzt. Hat jemand einen Hinweis?

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();
    }   
}

7 Stimmen

Um zu prüfen, ob eine Internetverbindung besteht, ist es wahrscheinlich am zuverlässigsten, einen der großen Nameserver anzupingen, z. B. mit if(Runtime.getRuntime().exec("/system/bin/ping -c 1 8.8.8.8").waitFor()==0) ... . Siehe meine Antwort für eine schönere Implementierung dieser Funktion. Btw die akzeptierte Antwort (und viele andere hier) einfach nach einem Netzanschluss und nicht das Internet.

0 Stimmen

4 Stimmen

Verwenden Sie nicht die Ping-Methode, sondern eine HTTP-Überprüfung. ICMP wird in einigen Netzen blockiert, so dass Ping nicht funktioniert. Beispiel: Bei mir zu Hause funktioniert es einwandfrei, aber nicht, wenn ich mobile Daten im Netz von Vodafone (in Ungarn) verwende. Sie können die beiden Methoden auch kombinieren, aber seien Sie vorsichtig, denn waitFor() wartet etwa 20 Sekunden, auch wenn -w oder -W verwendet wird.

47voto

Gilbou Punkte 5194

Prüfen Sie diesen Code... er hat bei mir funktioniert :)

public static void isNetworkAvailable(final Handler handler, final int timeout) {
    // ask fo message '0' (not connected) or '1' (connected) on 'handler'
    // the answer must be send before before within the 'timeout' (in milliseconds)

    new Thread() {
        private boolean responded = false;   
        @Override
        public void run() { 
            // set 'responded' to TRUE if is able to connect with google mobile (responds fast) 
            new Thread() {      
                @Override
                public void run() {
                    HttpGet requestForTest = new HttpGet("http://m.google.com");
                    try {
                        new DefaultHttpClient().execute(requestForTest); // can last...
                        responded = true;
                    } 
                    catch (Exception e) {
                    }
                } 
            }.start();

            try {
                int waited = 0;
                while(!responded && (waited < timeout)) {
                    sleep(100);
                    if(!responded ) { 
                        waited += 100;
                    }
                }
            } 
            catch(InterruptedException e) {} // do nothing 
            finally { 
                if (!responded) { handler.sendEmptyMessage(0); } 
                else { handler.sendEmptyMessage(1); }
            }
        }
    }.start();
}

Dann definiere ich den Handler:

Handler h = new Handler() {
    @Override
    public void handleMessage(Message msg) {

        if (msg.what != 1) { // code if not connected

        } else { // code if connected

        }   
    }
};

...und starten Sie den Test:

isNetworkAvailable(h,2000); // get the answser within 2000 ms

4 Stimmen

Was ist, wenn Google nicht erreichbar ist? Auch dafür ist die Berechtigung INTERNET erforderlich, die für die gestellte Aufgabe unnötig ist. Und schließlich werden dadurch Daten verbraucht (auch wenn sie unbedeutend sind). Das erscheint mir einfach zu kompliziert.

0 Stimmen

Mir gefällt diese Methode am besten, da ich die Ausnahmemeldung lesen kann, um herauszufinden, was genau schief läuft. danke.

29 Stimmen

@Tom, um fair zu sein, ist dies wahrscheinlich die einzig richtige Antwort. Die anderen Beispiele zeigen lediglich, ob eine Netzwerkverbindung verfügbar und / oder ob es eine Verbindung zu diesem Netz gibt, beantworten aber nicht die Frage, ob dieses Netz tatsächlich auch eine Fernverbindung (zum Beispiel zu einer Website). Dies beantwortet also die Frage des Posters, die anderen Antworten nicht

27voto

Ajhar Punkte 271

Gefunden bei und modifiziert (!) von diesem link :

Fügen Sie in Ihrer Manifestdatei mindestens hinzu:

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

Wahrscheinlich haben Sie bereits die Berechtigung INTERNET, wenn Sie darauf zugreifen. Dann ist eine boolesche Funktion, die es erlaubt, die Konnektivität zu testen:

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 {
        Log.v(TAG, "Internet Connection Not Present");
        return false;
    }
}

18voto

Android.Thirio.nl Punkte 197

Ich habe diesen Code gemacht, es ist der einfachste und es ist nur ein Boolean. durch Fragen if(isOnline()){

Sie erfahren, ob eine Verbindung besteht, und wenn sie eine Verbindung zu einer Seite herstellen kann, den Statuscode 200 (stabile Verbindung).

Stellen Sie sicher, dass Sie die richtige INTERNET y ACCESS_NETWORK_STATE Genehmigungen.

public boolean isOnline() {
    ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo netInfo = cm.getActiveNetworkInfo();
    if (netInfo != null && netInfo.isConnected()) {
        try {
            URL url = new URL("http://www.google.com");
            HttpURLConnection urlc = (HttpURLConnection) url.openConnection();
            urlc.setConnectTimeout(3000);
            urlc.connect();
            if (urlc.getResponseCode() == 200) {
                return new Boolean(true);
            }
        } catch (MalformedURLException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    return false;
}

6 Stimmen

Vielleicht sollten Sie 200 durch HttpURLConnection.HTTP_OK ersetzen

5 Stimmen

Was ist, wenn Google nicht erreichbar ist?

13voto

Musculaa Punkte 904

Für mich funktioniert es:

Um die Verfügbarkeit des Netzes zu überprüfen:

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

Um den 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;
}

0 Stimmen

Dies ist eine großartige lösung, um zu prüfen, ob ein server läuft, funktioniert wirklich gut. danke!

2 Stimmen

IsOnline() sollte nicht im Haupt-Thread ausgeführt werden, da es zu lange dauert und den Haupt-Thread blockiert, wenn es zwar ein Wi-Fi-Signal, aber kein Internet gibt.

13voto

Mohamed Embaby Punkte 922

Es gibt mehr als einen Weg

Erster, kürzester, aber ineffizienter Weg

Netzwerkstatus Erlaubnis nur erforderlich

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

Dann diese Methode,

 public boolean activeNetwork () {
        ConnectivityManager cm =
                (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);

        NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
        boolean isConnected = activeNetwork != null &&
                activeNetwork.isConnected();

        return isConnected;

    }

Wie in den Antworten zu sehen ConnectivityManager ist eine Lösung, ich habe sie einfach in eine Methode eingefügt, diese ist eine vereinfachte Methode, die alle verwenden
ConnectivityManager gibt true zurück, wenn es einen Netzwerkzugang, aber keinen Internetzugang gibt, d.h. wenn Ihr WiFi mit einem Router verbunden ist, der Router aber kein Internet hat, gibt es true zurück, es prüft die Verfügbarkeit der Verbindung

Zweitens: Effizienter Weg

Netzwerkstatus und Internet-Zugang erforderlich

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.INTERNET" />

Dann diese Klasse,

 public class CheckInternetAsyncTask extends AsyncTask<Void, Integer, Boolean> {

        private Context context;

        public CheckInternetAsyncTask(Context context) {
            this.context = context;
        }

        @Override
        protected Boolean doInBackground(Void... params) {

            ConnectivityManager cm =
                    (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);

            assert cm != null;
            NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
            boolean isConnected = activeNetwork != null &&
                    activeNetwork.isConnected();

            if (isConnected) {
                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();
                    if (urlc.getResponseCode() == 204 &&
                            urlc.getContentLength() == 0)
                        return true;

                } catch (IOException e) {
                    Log.e("TAG", "Error checking internet connection", e);
                    return false;
                }
            } else {
                Log.d("TAG", "No network available!");
                return false;
            }

            return null;
        }

        @Override
        protected void onPostExecute(Boolean result) {
            super.onPostExecute(result);
            Log.d("TAG", "result" + result);

            if(result){
                // do ur code
            }

        }

    }

Rufen Sie an. CheckInternetAsyncTask

new CheckInternetAsyncTask(getApplicationContext()).execute();

Einige Erklärungen :-

  • müssen Sie das Internet unter AsyncTask , sonst kann es android.os.NetworkOnMainThreadException in einigen Fällen

  • ConnectivityManager verwendet, um den Netzzugang zu prüfen, wenn true eine Anfrage sendet (Ping)

  • Anfrage senden an http://clients3.google.com/generate_204 Diese bekannte URL ist dafür bekannt, dass sie eine leere Seite mit einem HTTP-Status 204 zurückgibt, was schneller und effizienter ist als http://www.google.com , lesen diese . wenn Sie eine Website haben, ist es besser, Ihre Website anstelle von Google anzugeben, aber nur, wenn Sie sie in der App verwenden

  • Timeout kann in einem Bereich von 20ms bis 2000ms eingestellt werden, 1500ms wird üblicherweise verwendet.

2 Stimmen

Gute Frage, schade, dass Sie nicht mehr Punkte haben. Das muss die richtige Antwort sein.

0 Stimmen

Ich bin neu in Android. obwohl, Dies ist gut abgedeckt Antwort und es bekommen mehr Aufmerksamkeit @7569106

1 Stimmen

Beste und vollständige Antwort, danke. wenn jemand eine Website Hinweis, dass der Zustand muss wie diese urlc.getResponseCode() == 200 und nicht zu prüfen brauchen urlc.getContentLength() == 0

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X