Как именно Android определяет, является ли он онлайн?

Как именно Android определяет разницу между следующими состояниями?

  1. Имеет сетевой интерфейс (например, Wi-Fi или 3G), но не может получить доступ к Интернету.

  2. Активен сетевой интерфейс и должен попросить пользователя войти в сеть на веб-странице.

  3. Имеет сетевой интерфейс и имеет доступ к Интернету.

Может ли он отправить простой HTTP-запрос на фиксированный URL (возможно, на google.com?) И проверить, что возвращенный документ – это то, что он ожидает? Если да, знаем ли мы используемый URL?

UPDATE: обновлены коды, чтобы избежать NetworkOnMainThreadException

В настоящее время я использую следующий метод, чтобы определить, может ли устройство иметь доступ в Интернет или нет:

 public class NetworkConnectivityHelper { public void isDeviceConnectedToInternet(final Activity activity, final ResultCallback callback){ new Thread(new Runnable() { @Override public void run() { boolean isDeviceConnectedToInternet = false; NetworkInfo activeNetworkInfo = ((ConnectivityManager) activity.getSystemService(Context.CONNECTIVITY_SERVICE)).getActiveNetworkInfo(); if(activeNetworkInfo != null && activeNetworkInfo.isConnected()){ try { InetAddress.getByName("google.com").isReachable(2); isDeviceConnectedToInternet = true; } catch (UnknownHostException e){ isDeviceConnectedToInternet = false; } catch (IOException e){ isDeviceConnectedToInternet = false; } } final boolean result = isDeviceConnectedToInternet; activity.runOnUiThread(new Runnable() { @Override public void run() { callback.done(result); } }); } }).start(); } public static abstract class ResultCallback{ public abstract void done(boolean connected); } } 

Назовите это:

 @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); .... //Populate NetworkConnectivityHelper networkConnectivityHelper = new NetworkConnectivityHelper(); networkConnectivityHelper.isDeviceConnectedToInternet(activity, new NetworkConnectivityHelper.ResultCallback() { @Override public void done(boolean connected) { if (connected) { //Yey, the device is connected. //Now, do some work }else{ //The device is disconnected } } }); .... } 

надеюсь это поможет!

Да, вы также можете отправить пинг 🙂

Операции заказа, которые вы должны использовать в небольшом сетевом классе, должны быть: – Проверьте, включен ли интерфейс – проверьте, может ли он открыть сокет для Google.com или ping google.com

Попробуй это:

 public static boolean isNetworkAvailable(Context context) { ConnectivityManager cm = (ConnectivityManager) context .getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo info = cm.getActiveNetworkInfo(); return (info != null); }