Тестирование для Интернета, а не для сети

Обычно при создании приложений для Android, требующих вызовов API и т. д., я проверяю NetworkAvailability перед выполнением таких вызовов следующим образом:

    public boolean networkIsAvailable() {

        boolean result = false;
        ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo activeNetworkInfo = connectivityManager
                .getActiveNetworkInfo();
        if (activeNetworkInfo != null) {

            if (activeNetworkInfo.isConnected()) {
                result = true;

            }
        }
        return result;
    }

Достаточно просто ... Но что происходит, когда, скажем, пользователь находится на устройстве, которое не имеет мобильного подключения и подключено к сети Wi-Fi, но эта сеть Wi-Fi не имеет доступа в Интернет.

Существуют ли варианты, кроме перехвата java.net.UnknownHostException для проверки фактического доступа в Интернет?


person erik    schedule 18.07.2014    source источник


Ответы (1)


Вы можете использовать это:

public static boolean hasActiveInternetConnection(Context context) {
    if (isNetworkAvailable(context)) {
        try {
            HttpURLConnection urlc = (HttpURLConnection) (new URL("http://www.google.com").openConnection());
            urlc.setRequestProperty("User-Agent", "Test");
            urlc.setRequestProperty("Connection", "close");
            urlc.setConnectTimeout(1500); 

            urlc.connect();
            return (urlc.getResponseCode() == 200);
       } catch (IOException e) {
            Log.e(LOG_TAG, "Error checking internet connection", e);
        }
    } else {
        Log.d(LOG_TAG, "No network available!");
    }
    return false;
}

Помните это: «Как Тони Чо также указал в этом комментарии ниже, убедитесь, что вы не запускаете этот код в основном потоке, иначе вы получите исключение NetworkOnMainThread (в Android 3.0 или более поздней версии). Используйте AsyncTask или Runnable. вместо."

Источник: Определить, подключено ли устройство Android к Интернету

person Community    schedule 18.07.2014
comment
спасибо, я хотел избежать фактического сетевого вызова, но я думаю, что это действительно единственный вариант, кроме, возможно, тестирования сокетов - person erik; 21.07.2014