Как узнать, подключен ли Wi-Fi на Android? - PullRequest
229 голосов
/ 01 октября 2010

Я не хочу, чтобы мой пользователь даже пытался что-то скачать, если у него не подключен Wi-Fi.Тем не менее, я могу только сказать, что Wi-Fi включен, но у них все еще может быть соединение 3G.

android.net.wifi.WifiManager m = (WifiManager) getSystemService(WIFI_SERVICE);
android.net.wifi.SupplicantState s = m.getConnectionInfo().getSupplicantState();
NetworkInfo.DetailedState state = WifiInfo.getDetailedStateOf(s);
if (state != NetworkInfo.DetailedState.CONNECTED) {
    return false;
}

Однако, состояние не то, что я ожидал.Хотя Wi-Fi подключен, я получаю OBTAINING_IPADDR в качестве состояния.

Ответы [ 16 ]

455 голосов
/ 01 октября 2010

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

ConnectivityManager connManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo mWifi = connManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);

if (mWifi.isConnected()) {
    // Do whatever
}

ПРИМЕЧАНИЕ: Следует отметить (для нас здесь), что вам нужнодобавьте

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

к вашему

AndroidManifest.xml , чтобы это работало.

NOTE2 : public NetworkInfo getNetworkInfo (int networkType) устарела:

Этот метод устарел на уровне API 23. Этот метод не поддерживает несколько подключенных сетей одного типа.Вместо этого используйте getAllNetworks () и getNetworkInfo (android.net.Network).

NOTE3 : public static final int TYPE_WIFI теперь не рекомендуется:

Эта константа устарела на уровне API 28. Приложения должны вместо этого использовать NetworkCapabilities.hasTransport (int) или requestNetwork (NetworkRequest, NetworkCallback) для запроса соответствующей сети.для поддерживаемых перевозок.

63 голосов
/ 20 января 2016

Поскольку метод NetworkInfo.isConnected () теперь устарел в API-23 , вот метод, который определяет, является ли адаптер Wi-Fi и также подключен к точке доступа, используя вместо этого WifiManager:

private boolean checkWifiOnAndConnected() {
    WifiManager wifiMgr = (WifiManager) getSystemService(Context.WIFI_SERVICE);

    if (wifiMgr.isWifiEnabled()) { // Wi-Fi adapter is ON

        WifiInfo wifiInfo = wifiMgr.getConnectionInfo();

        if( wifiInfo.getNetworkId() == -1 ){
            return false; // Not connected to an access point
        }
        return true; // Connected to an access point
    }
    else {
        return false; // Wi-Fi adapter is OFF
    }
}
34 голосов
/ 01 октября 2010

Я просто использую следующее:

SupplicantState supState; 
wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);
WifiInfo wifiInfo = wifiManager.getConnectionInfo();
supState = wifiInfo.getSupplicantState();

Который вернет одно из этих состояний во время вызова getSupplicantState ();

ASSOCIATED - Ассоциация завершена.

ОБЪЕДИНЕНИЕ - Попытка связаться с точка доступа.

ЗАВЕРШЕНО - Вся аутентификация завершено.

ОТКЛЮЧЕНО - Это состояние указывает этот клиент не связан, но скорее всего, начать искать доступ точка.

DORMANT - добавленное в Android состояние, которое сообщается, когда клиент выдает явная команда DISCONNECT.

FOUR_WAY_HANDSHAKE - 4-позиционный ключ WPA Рукопожатие в процессе.

GROUP_HANDSHAKE - Ключ группы WPA Рукопожатие в процессе.

НЕАКТИВНО - Неактивное состояние.

INVALID - псевдо-состояние, которое должно обычно никогда не видят.

СКАНИРОВАНИЕ - Сканирование сети.

UNINITIALIZED - Нет соединения.

18 голосов
/ 27 января 2012

Я использую это в своих приложениях, чтобы проверить, активна ли сеть Wi-Fi:

ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo ni = cm.getActiveNetworkInfo();
if (ni != null && ni.getType() == ConnectivityManager.TYPE_WIFI)
{

    // Do your work here

}
17 голосов
/ 09 июля 2011

Я посмотрел на несколько таких вопросов и придумал:

ConnectivityManager connManager = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE);
NetworkInfo wifi = connManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
NetworkInfo mobile = connManager .getNetworkInfo(ConnectivityManager.TYPE_MOBILE);

if (wifi.isConnected()){
    // If Wi-Fi connected
}

if (mobile.isConnected()) {
    // If Internet connected
}

Я использую if для проверки лицензии в Root Toolbox PRO, и, похоже, он отлично работает.

6 голосов
/ 12 января 2016

Хотя ответ Джейсона правильный, в настоящее время getNetWorkInfo (int) является устаревшим методом. Итак, следующая функция будет хорошей альтернативой:

public static boolean isWifiAvailable (Context context)
{
    boolean br = false;
    ConnectivityManager cm = null;
    NetworkInfo ni = null;

    cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
    ni = cm.getActiveNetworkInfo();
    br = ((null != ni) && (ni.isConnected()) && (ni.getType() == ConnectivityManager.TYPE_WIFI));

    return br;
}
3 голосов
/ 08 февраля 2015

Используя WifiManager вы можете сделать:

WifiManager wifi = (WifiManager) getSystemService (Context.WIFI_SERVICE);
if (wifi.getConnectionInfo().getNetworkId() != -1) {/* connected */}

Метод getNeworkId возвращает -1, только если он не подключен к сети;

3 голосов
/ 17 августа 2012
ConnectivityManager manager = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE);
boolean is3g = manager.getNetworkInfo(
                  ConnectivityManager.TYPE_MOBILE).isConnectedOrConnecting();
boolean isWifi = manager.getNetworkInfo(
                    ConnectivityManager.TYPE_WIFI).isConnectedOrConnecting();

Log.v("", is3g + " ConnectivityManager Test " + isWifi);
if (!is3g && !isWifi) {
    Toast.makeText(
        getApplicationContext(),
        "Please make sure, your network connection is ON ",
        Toast.LENGTH_LONG).show();
}
else {
    // Put your function() to go further;
}
2 голосов
/ 03 апреля 2014

Это работает для меня:

    ConnectivityManager conMan = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);

    // Mobile
    State mobile = conMan.getNetworkInfo(ConnectivityManager.TYPE_MOBILE).getState();

    // Wi-Fi
    State wifi = conMan.getNetworkInfo(ConnectivityManager.TYPE_WIFI).getState();

    // And then use it like this:

    if (mobile == NetworkInfo.State.CONNECTED || mobile == NetworkInfo.State.CONNECTING)
    {
        Toast.makeText(Wifi_Gprs.this,"Mobile is Enabled :) ....",Toast.LENGTH_LONG).show();
    }
    else if (wifi == NetworkInfo.State.CONNECTED || wifi == NetworkInfo.State.CONNECTING)
    {
        Toast.makeText(Wifi_Gprs.this,"Wifi is Enabled  :) ....",Toast.LENGTH_LONG).show();
    }
    else
    {
        Toast.makeText(Wifi_Gprs.this,"No Wifi or Gprs Enabled :( ....",Toast.LENGTH_LONG).show();
    }

И добавить это разрешение:

<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
2 голосов
/ 06 декабря 2013

Попробуйте этот метод.

public boolean isInternetConnected() {
    ConnectivityManager conMgr = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
    boolean ret = true;
    if (conMgr != null) {
        NetworkInfo i = conMgr.getActiveNetworkInfo();

        if (i != null) {
            if (!i.isConnected()) {
                ret = false;
            }

            if (!i.isAvailable()) {
                ret = false;
            }
        }

        if (i == null)
            ret = false;
    } else
        ret = false;
    return ret;
}

Этот метод поможет найти доступное интернет-соединение или нет.

...