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.

6voto

kreker Punkte 5697

2 Stimmen

Aber die dort beschriebene Methode prüft nicht wirklich, ob eine Internetverbindung besteht, sondern nur, ob eine Verbindung hergestellt wurde (ob eine Verbindung zum Internet besteht oder nicht). Der Titel dieses offiziellen Dokuments ist wirklich irreführend.

3 Stimmen

Es ist besser, eine Antwort auf die Frage zu geben, als nur einen Link zu Informationen zu posten. Was ist, wenn der Link verschwindet? Dann haben wir keine Antwort.

6voto

Akshay Paliwal Punkte 3370

Mit dieser Methode können Sie die Netzverfügbarkeit ermitteln.

public static boolean isDeviceOnline(Context context) {
        boolean isConnectionAvail = false;
        try {
            ConnectivityManager cm = (ConnectivityManager) context
                    .getSystemService(Context.CONNECTIVITY_SERVICE);
            NetworkInfo netInfo = cm.getActiveNetworkInfo();
            return netInfo.isConnected();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return isConnectionAvail;
    }

6voto

Jorgesys Punkte 119076

Es ist sehr wichtig zu prüfen, ob wir eine Verbindung haben mit [isAvailable()](http://developer.android.com/intl/es/reference/android/net/NetworkInfo.html#isAvailable()) und ob es möglich ist, eine Verbindung herzustellen mit [isConnected()](http://developer.android.com/intl/es/reference/android/net/NetworkInfo.html#isConnected())

private static ConnectivityManager manager;

public static boolean isOnline(Context context) {
    ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();
    return networkInfo != null && networkInfo.isAvailable() && networkInfo.isConnected();
}

und Sie können die Art des aktiven Netzes abwählen WiFi :

public static boolean isConnectedWifi(Context context) {
    ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();
    return networkInfo != null && networkInfo.getType() == ConnectivityManager.TYPE_WIFI;
}

oder mobil Móvil :

public static boolean isConnectedMobile(Context context) {
    ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();
    return networkInfo != null && networkInfo.getType() == ConnectivityManager.TYPE_MOBILE;
}

Vergessen Sie nicht die Genehmigungen:

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

0 Stimmen

Nette Zusammenfassung der Komponenten für die Gerätekonnektivität, man muss sie nur in try/catch-Anweisungen verpacken, um Abstürze zu vermeiden. Ähnlich, machen Sie einfach Ihre Routine HttpURLConnection Anrufe, solange sie in Fehlerbehandlung verpackt sind, werden Sie bald wissen, ob Sie eine Internetverbindung haben oder nicht

6voto

WonderWorker Punkte 7910

Diese Methode bietet Ihnen die Möglichkeit einer sehr schnellen Methode (für Echtzeit-Feedback) oder einer langsameren Methode (für einmalige Prüfungen, die Zuverlässigkeit erfordern).

public boolean isNetworkAvailable(bool SlowButMoreReliable) {
    bool Result = false; 
    try {
        if(SlowButMoreReliable){
            ConnectivityManager MyConnectivityManager = null;
            MyConnectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);

            NetworkInfo MyNetworkInfo = null;
            MyNetworkInfo = MyConnectivityManager.getActiveNetworkInfo();

            Result = MyNetworkInfo != null && MyNetworkInfo.isConnected();

        } else
        {
            Runtime runtime = Runtime.getRuntime();
            Process ipProcess = runtime.exec("/system/bin/ping -c 1 8.8.8.8");

            int i = ipProcess.waitFor();

            Result = i== 0;

        }

    } catch(Exception ex)
    {
        //Common.Exception(ex); //This method is one you should have that displays exceptions in your log
    }
    return Result;
}

6voto

laplasz Punkte 3111

Für mich war es keine gute Praxis, den Verbindungsstatus in der Activity-Klasse zu überprüfen, weil

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

sollte dort aufgerufen werden, oder Sie müssen Ihre Activity-Instanz (Kontext) an die Connection-Handler-Klasse weiterreichen, um den Verbindungsstatus dort überprüfen zu können Wenn keine Verbindung verfügbar ist (Wifi, Netzwerk), fange ich die UnknownHostException Ausnahme:

JSONObject jObj = null;
Boolean responded = false;
HttpGet requestForTest = new HttpGet("http://myserver.com");
try {
    new DefaultHttpClient().execute(requestForTest);
    responded = true;
} catch (UnknownHostException e) {
    jObj = new JSONObject();
    try {
        jObj.put("answer_code", 1);
        jObj.put("answer_text", "No available connection");
    } catch (Exception e1) {}
    return jObj;
} catch (IOException e) {
    e.printStackTrace();
}

Auf diese Weise kann ich diesen Fall zusammen mit den anderen Fällen in der gleichen Klasse behandeln (mein Server antwortet immer mit einem Json-String zurück)

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