Проверьте интернет-соединение, а не состояние сети - PullRequest
0 голосов
/ 27 октября 2018

Мое приложение также работает в автономном режиме и работает нормально, когда интернет доступен. Я использую следующий код для проверки интернет-соединения.

ConnectivityManagercm = (ConnectivityManager) ConnectivityClass.getInstance().getApplicationContext().getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
return activeNetwork != null && activeNetwork.isConnectedOrConnecting();

Проблема в том, что если мы подключили сеть Wi-Fi, которая не включает доступ в Интернет или требует аутентификации на основе браузера, она все равно возвращает значение true. Должно возвращать false, если интернет недоступен. Мне нужно проверять подключение к Интернету, а не состояние подключения к мобильной сети.

minSdkVersion 15

Ответы [ 3 ]

0 голосов
/ 27 октября 2018

надеюсь, используя этот код, вы можете проверить сетевое соединение

public class InternetCheckerTask extends AsyncTask<Void, Void, Void> {

private OnInternetCheckListener listener;
private int authStatus;
private boolean running;

public InternetCheckerTask(OnInternetCheckListener listener) {
    this.listener = listener;
}

@Override
protected Void doInBackground(Void... voids) {
    running = true;
    if(isInternetReallyAvailable()) {
        authStatus = AuthConstants.CONNECTED;
    } else {
        authStatus = AuthConstants.NOT_CONNECTED;
    }
    return null;
}

@Override
protected void onPostExecute(Void aVoid) {
    if(listener != null) {
        listener.onResponse(authStatus);
    }
    running = false;
}

// should not be called from ui thread, can be called only from background service
private boolean isInternetReallyAvailable() {
    ConnectivityManager cm = (ConnectivityManager) App.getInstance().getBaseContext().getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo activeNetwork = cm.getActiveNetworkInfo();

    if(activeNetwork == null || !activeNetwork.isAvailable() || !activeNetwork.isConnected()) {
        return false;
    } else {
        // TCP/HTTP/DNS (depending on the port, 53=DNS, 80=HTTP, etc.)
        try {
            int timeoutMs = 1500;
            Socket sock = new Socket();
            SocketAddress sockaddr = new InetSocketAddress("8.8.8.8", 53);

            sock.connect(sockaddr, timeoutMs);
            sock.close();

            return true;
        } catch (IOException e) {
            return false;
        }
    }
}

public boolean isRunning() {
    return running;
}

public interface OnInternetCheckListener {
    void onResponse(int status);
}

}

создать класс и определить следующее постоянное значение

public class AuthConstants {
    public static final int CONNECTED = 1;
    public static final int NOT_CONNECTED = 2;
}

и вот как вы должны использовать эту функцию из любого места, где вам нужно

new InternetCheckerTask(new InternetCheckerTask.OnInternetCheckListener() {
        @Override
        public void onResponse(int status) {
            switch (status) {
                case AuthConstants.CONNECTED:
                    // connection is available
                    break;
                default:
                    // no connection
                    break;
            }
        }
    }).execute();
0 голосов
/ 27 октября 2018
public static boolean isOnline(Context ctx) {
    ConnectivityManager cm = (ConnectivityManager) ctx
            .getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo netInfo = cm != null
            ? cm.getActiveNetworkInfo()
            : null;
    return netInfo != null && netInfo.isConnectedOrConnecting();
}
  • Проверьте мой ответ для обработки изменений сети между Wi-Fi и мобильными данными.
0 голосов
/ 27 октября 2018

Вы можете пропинговать URL. Тогда вы можете знать, что Интернет точно доступен.

public Boolean isInternetAvailable() {
    try {
        Process process = java.lang.Runtime.getRuntime().exec("ping -c 1 www.google.com");

        boolean avaiablility = (p1.waitFor()==0);
        return avaiablility;
    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    return false;
}
...