Как проверить работает интернет или нет? не значит инвалид или нет? в андроиде

В моем приложении я хочу отправлять текущее местоположение и время непрерывно каждые 5 минут. Если сеть недоступна, приложение должно хранить данные (здесь я использую sqlite для хранения) и отправлять данные после включения сети или подключения к Интернету.

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

Я надеюсь, что вы поняли мою проблему


person Aristo Michael    schedule 20.12.2013    source источник


Ответы (5)


Метод getActiveNetworkInfo() класса ConnectivityManager возвращает экземпляр NetworkInfo, представляющий первый подключенный сетевой интерфейс, который он может найти, или null, если нет, если интерфейсы подключены. Проверки того, возвращает ли этот метод null, должно быть достаточно, чтобы узнать, доступно ли подключение к Интернету.

private boolean isNetworkAvailable() {
ConnectivityManager connectivityManager 
      = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();
return activeNetworkInfo != null && activeNetworkInfo.isConnected();

}

Вам также понадобятся:

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

в вашем манифесте Android.

Обратите внимание, что наличие активного сетевого интерфейса не гарантирует доступности конкретной сетевой службы. Проблемы с сетью, время простоя сервера, низкий уровень сигнала, закрытые порталы, фильтры контента и тому подобное могут помешать вашему приложению получить доступ к серверу. Например, вы не можете точно сказать, может ли ваше приложение связаться с Twitter, пока не получите действительный ответ от службы Twitter.

person M D    schedule 20.12.2013

Попробуйте с этим кодом, он может вам помочь:

import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;

public class NetworkUtils {
    public static boolean isNetworkAvailable(Context context) {
        ConnectivityManager connection = (ConnectivityManager) context
                .getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo nInfo = null;
        if (connection != null) {
            nInfo = connection.getActiveNetworkInfo();
        }
        if (nInfo == null || !nInfo.isConnectedOrConnecting()) {
            return false;
        }

        if (nInfo == null || !nInfo.isConnected()) {
            return false;
        }
        if (nInfo != null
                && ((nInfo.getType() == ConnectivityManager.TYPE_MOBILE) || (nInfo
                        .getType() == ConnectivityManager.TYPE_WIFI))) {
            if (nInfo.getState() != NetworkInfo.State.CONNECTED
                    || nInfo.getState() == NetworkInfo.State.CONNECTING) {
                return false;
            }
        }
        return true;
    }
}

Используйте этот метод в своем базовом классе и вызывайте его везде, где хотите проверить сеть.

public boolean isNetworkAvailable() {
        if (NetworkUtils.isNetworkAvailable(getActivity())) {
            return true;
        } else {
            BaseDialogue.showCustomDialogue(getActivity(), getResources()
                    .getString(R.string.app_name),
                    "No Network",
                    getResources().getString(android.R.string.ok),
                    getResources().getString(android.R.string.cancel), null);
            return false;
        }
    }
person Nagaraja    schedule 20.12.2013
comment
Все еще работаю над этим. мы уверены, что сможем получить правильное состояние сети @Nagaraja - person Aristo Michael; 20.12.2013

Это то, что я использую:

private boolean isOnline() {
    ConnectivityManager cm = (ConnectivityManager)v.getContext().getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo netInfo = cm.getActiveNetworkInfo();
    if (netInfo != null && netInfo.isConnectedOrConnecting()) return true;
    return false;
}

Это разрешение необходимо:

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
person stefana    schedule 20.12.2013

Можно пойти и таким путем:

Создайте два java-файла в своем пакете: NetworkConnectivity.java и NetworkMonitorListener.java, как показано ниже:

NetworkConnectivity.java:

public class NetworkConnectivity {

    private static NetworkConnectivity sharedNetworkConnectivity = null;

    private Activity activity = null;

    private final Handler handler = new Handler();
    private Runnable runnable = null;

    private boolean stopRequested = false;
    private boolean monitorStarted = false;

    private static final int NETWORK_CONNECTION_YES = 1;
    private static final int NETWORK_CONNECTION_NO = -1;
    private static final int NETWORK_CONNECTION_UKNOWN = 0;

    private int connected = NETWORK_CONNECTION_UKNOWN;

    public static final int MONITOR_RATE_WHEN_CONNECTED_MS = 5000;
    public static final int MONITOR_RATE_WHEN_DISCONNECTED_MS = 1000;

    private final List<NetworkMonitorListener> networkMonitorListeners = new ArrayList<NetworkMonitorListener>();

    private NetworkConnectivity() {
    }

    public synchronized static NetworkConnectivity sharedNetworkConnectivity() {
        if (sharedNetworkConnectivity == null) {
            sharedNetworkConnectivity = new NetworkConnectivity();
        }

        return sharedNetworkConnectivity;
    }

    public void configure(Activity activity) {
        this.activity = activity;
    }

    public synchronized boolean startNetworkMonitor() {
        if (this.activity == null) {
            return false;
        }

        if (monitorStarted) {
            return true;
        }

        stopRequested = false;
        monitorStarted = true;

        (new Thread(new Runnable() {
            @Override
            public void run() {
                doCheckConnection();
            }
        })).start();

        return true;
    }

    public synchronized void stopNetworkMonitor() {
        stopRequested = true;
        monitorStarted = false;
    }

    public void addNetworkMonitorListener(NetworkMonitorListener l) {
        this.networkMonitorListeners.add(l);
        this.notifyNetworkMonitorListener(l);
    }

    public boolean removeNetworkMonitorListener(NetworkMonitorListener l) {
        return this.networkMonitorListeners.remove(l);
    }

    private void doCheckConnection() {

        if (stopRequested) {
            runnable = null;
            return;
        }

        final boolean connectedBool = this.isConnected();
        final int _connected = (connectedBool ? NETWORK_CONNECTION_YES
                : NETWORK_CONNECTION_NO);

        if (this.connected != _connected) {

            this.connected = _connected;

            activity.runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    notifyNetworkMonitorListeners();
                }
            });
        }

        runnable = new Runnable() {
            @Override
            public void run() {
                doCheckConnection();
            }
        };

        handler.postDelayed(runnable,
                (connectedBool ? MONITOR_RATE_WHEN_CONNECTED_MS
                        : MONITOR_RATE_WHEN_DISCONNECTED_MS));
    }

    public boolean isConnected() {
        try {
            ConnectivityManager cm = (ConnectivityManager) activity
                    .getSystemService(Context.CONNECTIVITY_SERVICE);
            NetworkInfo netInfo = cm.getActiveNetworkInfo();

            if (netInfo != null && netInfo.isConnected()) {
                return true;
            } else {
                return false;
            }
        } catch (Exception e) {
            return false;
        }
    }

    private void notifyNetworkMonitorListener(NetworkMonitorListener l) {
        try {
            if (this.connected == NETWORK_CONNECTION_YES) {
                l.connectionEstablished();
            } else if (this.connected == NETWORK_CONNECTION_NO) {
                l.connectionLost();
            } else {
                l.connectionCheckInProgress();
            }
        } catch (Exception e) {
        }
    }

    private void notifyNetworkMonitorListeners() {
        for (NetworkMonitorListener l : this.networkMonitorListeners) {
            this.notifyNetworkMonitorListener(l);
        }
    }

}

NetworkMonitorListener.java:

public interface NetworkMonitorListener {

    public void connectionEstablished();
    public void connectionLost();
    public void connectionCheckInProgress();
}

И, наконец, используйте этот класс в своей деятельности, как показано ниже, например:

        NetworkConnectivity.sharedNetworkConnectivity().configure(this);
        NetworkConnectivity.sharedNetworkConnectivity().startNetworkMonitor();
        NetworkConnectivity.sharedNetworkConnectivity()
                .addNetworkMonitorListener(new NetworkMonitorListener() {
                    @Override
                    public void connectionCheckInProgress() {
                        // Okay to make UI updates (check-in-progress is rare)
                    }

                    @Override
                    public void connectionEstablished() {
                        // Okay to make UI updates -- do something now that
                        // connection is avaialble

                    }

                    @Override
                    public void connectionLost() {
                        // Okay to make UI updates -- bummer, no connection

                    }
                });

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

person Chintan Soni    schedule 20.12.2013

Попробуйте реализовать этот метод в своем проекте:

private boolean netCheckin() {
    try {
        ConnectivityManager nInfo = (ConnectivityManager) getSystemService(
            Context.CONNECTIVITY_SERVICE);
        nInfo.getActiveNetworkInfo().isConnectedOrConnecting();
        Log.d(tag, "Net avail:"
            + nInfo.getActiveNetworkInfo().isConnectedOrConnecting());
        ConnectivityManager cm = (ConnectivityManager) getSystemService(
            Context.CONNECTIVITY_SERVICE);
        NetworkInfo netInfo = cm.getActiveNetworkInfo();
        if (netInfo != null && netInfo.isConnectedOrConnecting()) {
            Log.d(tag, "Network Available");
            return true;
        } else {
            Log.d(tag, "Network Not Available");
            return false;
        }
    } catch (Exception e) {
        return false;
    }
}

а также проверьте, указано ли разрешение на доступ в Интернет в файле AndroidManifest.

person Ganesh Katikar    schedule 20.12.2013