самый быстрый способ проверить доступ в Интернет в android

Я создаю приложение, которое помогает настроить параметры WIFI на Android, и мне нужен самый быстрый способ проверить подключение к Интернету. Рабочее соединение - подключено не только WIFI!

Я использую этот код

URL url = new URL("http://www.google.com");
                                final HttpURLConnection urlc = (HttpURLConnection) url.openConnection();
                                urlc.setRequestProperty("User-Agent", "Android Application");
                                urlc.setRequestProperty("Connection", "close");
                                        urlc.setConnectTimeout(3 * 1000);
                                        urlc.connect();

                                        if (urlc.getResponseCode() == 200) {//Good response



                                        } else { 
                                        //bad   

                                        }
                                    } catch (IOException e) {
                                         //bad
                                    }

но требуется много времени, чтобы получить ответ, около 20 секунд (хотя тайм-аут составляет 3 секунды?). Есть ли более быстрый способ сделать это?

1
добавлено
Просмотры: 1
de
goto this android «> stackoverflow.com/questions/12889750/…
добавлено автор Rahul Baradia, источник
@ user1591982 Помог ли мой ответ в любом случае?
добавлено автор kaderud, источник
@ user1591982 Какие ошибки вы получаете, если таковые имеются? Я тестировал этот код сбоку и назад :-), и он до сих пор ловит все случаи. (android 4.x)
добавлено автор kaderud, источник
Нет извините. Тот же результат. Но большое спасибо за ответ!
добавлено автор user1591982, источник
Нет ошибок, но если нет доступа в Интернет, требуется полминуты, чтобы исключить исключение, даже если тайм-аут установлен на 5 секунд.
добавлено автор user1591982, источник

2 ответы

Просто используйте метод ниже, прежде чем выполнять вызов сервера:

public static boolean isOnline() {

    try {
        ConnectivityManager cm = (ConnectivityManager) Const.CONTEXT
                .getSystemService(Context.CONNECTIVITY_SERVICE);

        if (cm != null) {
            return cm.getActiveNetworkInfo().isConnectedOrConnecting();
        } else {
            return false;
        }
    } catch (Exception e) {
        return false;
    }
}
1
добавлено
да ты прав
добавлено автор Bhavdip Sagar, источник
это хорошо протестированный код, но убедитесь, что вы пытаетесь получить доступ, который может быть недоступен или нет, убедитесь, что в моем коде выше Const.Context вы используете контекст, если бы использовали свой контекст.
добавлено автор Bhavdip Sagar, источник
@Bhavdip Pathar Этот код не проверяет, подключено ли устройство к Интернету, ТОЛЬКО, если оно подключено к сети, например, UMTS или WiFi. Ознакомьтесь с документами API: developer.android.com/reference/android/net/&hellip ;
добавлено автор kaderud, источник
если он возвращает true, устройство имеет доступ к Интернету?
добавлено автор user1591982, источник
он возвращает true, даже если нет доступа в Интернет
добавлено автор user1591982, источник
Он говорит, что подключен, пока устройство подключено к беспроводной сети, и мне нужно, чтобы проверить, есть ли доступ к WWW
добавлено автор user1591982, источник

Your code looks fine, perhaps it would work better if you also added urlc.setReadTimeout(TIME_OUT);

Ниже приведен код, который я использую, и он до сих пор обнаружил различные сценарии подключения WiFi/Mobile, но не Интернет и так далее.

public boolean isNetworksAvailable() {
    ConnectivityManager mConnMgr = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
    if (mConnMgr != null)  {
        NetworkInfo[] mNetInfo = mConnMgr.getAllNetworkInfo();
        if (mNetInfo != null) {
            for (int i = 0; i < mNetInfo.length; i++) {
                if (mNetInfo[i].getState() == NetworkInfo.State.CONNECTED) {
                    return true;
                }
            }
        }
    }
    return false;
}

What this code does is loop thru all the Network states to make sure it finds a CONNECTED state, only then is isNetworksAvailable()

В isInternetConnected мы проверяем, можем ли мы сделать простую HTTP-связь.

public boolean isInternetConnected(String mUrl) {
    final int CONNECTION_TIMEOUT = 2000;
    if (isNetworksAvailable()) {
        try {
            HttpURLConnection mURLConnection = (HttpURLConnection) (new URL(mUrl).openConnection());
            mURLConnection.setRequestProperty("User-Agent", "ConnectionTest");
            mURLConnection.setRequestProperty("Connection", "close");
            mURLConnection.setConnectTimeout(CONNECTION_TIMEOUT);
            mURLConnection.setReadTimeout(CONNECTION_TIMEOUT);
            mURLConnection.connect();
            return (mURLConnection.getResponseCode() == 200);
        } catch (IOException ioe) {
            Log.e("isInternetConnected", "Exception occured while checking for Internet connection: ", ioe);
        }
    } else {
        Log.e("isInternetConnected", "Not connected to WiFi/Mobile and no Internet available.");
    }
    return false;
}

Этот код следует использовать в AsyncTask или иначе вам нужно использовать его со следующим кодом, например, в onCreate() (Но настоятельно рекомендуется использовать AsyncTask вместо создания сети в потоке пользовательского интерфейса)

StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);

Проверьте, подключен ли к Интернету:

if (isInternetConnected("http://www.google.com")) {
    showToast("Internet connected");
} else {
    showToast("No connection to the Internet!");
}
0
добавлено