Подтвердить что ты не робот

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

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

  • Активен сетевой интерфейс (например, Wi-Fi или 3G), но не доступен для доступа в Интернет.

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

  • Сетевой интерфейс активен и доступен для доступа в Интернет.

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

4b9b3361

Ответ 1

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

}

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

Ответ 2

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

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

Ответ 3

Попробуйте следующее:

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

    return (info != null);
}