Как узнать, подключен ли Wi-Fi на Android?

Я не хочу, чтобы мой пользователь даже пытался что-то скачать, если у него не подключен 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 как государство.

24 ответа

Решение

Вы должны иметь возможность использовать 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 для этого, чтобы работать.

ПРИМЕЧАНИЕ2: public NetworkInfo getNetworkInfo (int networkType) сейчас устарела:

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

ПРИМЕЧАНИЕ3: public static final int TYPE_WIFI сейчас устарела:

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

Поскольку метод 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
    }
}

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

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

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

ОБЪЕДИНЕНО - Ассоциация завершена.

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

ВЫПОЛНЕНО - Все аутентификации завершены.

DISCONNECTED - это состояние указывает, что клиент не связан, но, вероятно, начнет искать точку доступа.

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

FOUR_WAY_HANDSHAKE - Идет процесс рукопожатия 4-стороннего ключа WPA.

GROUP_HANDSHAKE - Идет рукопожатие ключа группы WPA.

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

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

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

UNINITIALIZED - Нет связи.

Я использую это в своих приложениях, чтобы проверить, является ли активная сеть 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

}

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

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, и, похоже, он отлично работает.

В NetworkInfo класс устарел с уровня API 29, вместе с соответствующими методами доступа, такими как ConnectivityManager#getNetworkInfo() а также ConnectivityManager#getActiveNetworkInfo().

Документация в настоящее время предлагает людям использовать ConnectivityManager.NetworkCallback API для асинхронизированного мониторинга обратного вызова или используйте ConnectivityManager#getNetworkCapabilities или ConnectivityManager#getLinkProperties для синхронизированного доступа к сетевой информации

Вместо этого вызывающим абонентам следует использовать API ConnectivityManager.NetworkCallback, чтобы узнать об изменениях подключения, или переключиться на использование ConnectivityManager#getNetworkCapabilities или ConnectivityManager#getLinkProperties для синхронного получения информации.


Чтобы проверить, подключен ли WiFi, вот код, который я использую:

Котлин:

val connMgr = applicationContext.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager?
connMgr?: return false
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
    val network: Network = connMgr.activeNetwork ?: return false
    val capabilities = connMgr.getNetworkCapabilities(network)
    return capabilities != null && capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)
} else {
    val networkInfo = connMgr.activeNetworkInfo ?: return false
    return networkInfo.isConnected && networkInfo.type == ConnectivityManager.TYPE_WIFI
}

Джава:

ConnectivityManager connMgr = (ConnectivityManager) getApplicationContext().getSystemService(Context.CONNECTIVITY_SERVICE);
if (connMgr == null) {
    return false;
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
    Network network = connMgr.getActiveNetwork();
    if (network == null) return false;
    NetworkCapabilities capabilities = connMgr.getNetworkCapabilities(network);
    return capabilities != null && capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI);
} else {
    NetworkInfo networkInfo = connMgr.getActiveNetworkInfo();
    return networkInfo.isConnected() && networkInfo.getType() == ConnectivityManager.TYPE_WIFI;
}

Не забудьте также добавить разрешение ACCESS_NETWORK_STATE в ваш файл манифеста.

Хотя ответ Джейсона верен, в настоящее время 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;
}

Во многих ответах используется устаревший код или код, доступный в более высоких версиях API. Сейчас использую что-то вроде этого

ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        if(connectivityManager != null) {
            for (Network net : connectivityManager.getAllNetworks()) {
                NetworkCapabilities nc = connectivityManager.getNetworkCapabilities(net);
                if (nc != null && nc.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)
                        && nc.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET))
                    return true;
            }
        }
        return false;

Это работает для устройств Android до и после Q

      fun isWifiConnected(context: Context):Boolean {
    val cm = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
    return if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) {
        val activeNetwork: NetworkInfo? = cm.activeNetworkInfo
        activeNetwork?.isConnected == true
    }else{
        val capabilities = cm.getNetworkCapabilities(cm.activeNetwork)
        capabilities?.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)==true
    }
}

Следующий код (в Kotlin) работает с API 21 до, по крайней мере, текущей версии API (API 29). Функция getWifiState() возвращает одно из 3 возможных значений состояния сети WiFi: Disable, EnabledNotConnected и Connected, которые были определены в классе перечисления. Это позволяет принимать более детальные решения, такие как информирование пользователя о включении Wi-Fi или, если он уже включен, о подключении к одной из доступных сетей. Но если все, что нужно, - это логическое значение, указывающее, подключен ли интерфейс WiFi к сети, тогда другая функция isWifiConnected() даст вам это. Он использует предыдущий и сравнивает результат с Connected.

Он вдохновлен некоторыми из предыдущих ответов, но пытается решить проблемы, возникшие в результате эволюции Android API или медленно растущей доступности IP V6. Уловка заключалась в том, чтобы использовать:

wifiManager.connectionInfo.bssid != null 

вместо того:

  1. getIpAddress() == 0, который действителен только для IP V4 или
  2. getNetworkId() == -1, для которого теперь требуется другое специальное разрешение (Местоположение)

Согласно документации: https://developer.android.com/reference/kotlin/android/net/wifi/WifiInfo.html, он вернет значение null, если не подключен к сети. И даже если у нас нет разрешения на получение реального значения, он все равно вернет что-то отличное от null, если мы подключены.

Также имейте в виду следующее:

В выпусках до android.os.Build.VERSION_CODES#N этот объект должен быть получен только из Context#getApplicationContext(), а не из любого другого производного контекста, чтобы избежать утечек памяти в вызывающем процессе.

В Манифесте не забудьте добавить:

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

Предлагаемый код:

class MyViewModel(application: Application) : AndroidViewModel(application) {

   // Get application context
    private val myAppContext: Context = getApplication<Application>().applicationContext

   // Define the different possible states for the WiFi Connection
    internal enum class WifiState {
        Disabled,               // WiFi is not enabled
        EnabledNotConnected,    // WiFi is enabled but we are not connected to any WiFi network
        Connected,              // Connected to a WiFi network
    }

    // Get the current state of the WiFi network
    private fun getWifiState() : WifiState {

        val wifiManager : WifiManager = myAppContext.applicationContext.getSystemService(Context.WIFI_SERVICE) as WifiManager

        return if (wifiManager.isWifiEnabled) {
                    if (wifiManager.connectionInfo.bssid != null)
                        WifiState.Connected
                    else
                        WifiState.EnabledNotConnected
               } else {
                    WifiState.Disabled
               }
    }

    // Returns true if we are connected to a WiFi network
    private fun isWiFiConnected() : Boolean {
        return (getWifiState() == WifiState.Connected)
    }
}
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;
}

С помощью WifiManager ты можешь сделать:

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

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

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

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

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

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

    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" />

Подобно ответу @Jason Knight, но по-Котлински:

val connManager = getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
val mWifi = connManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI)

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

В новой версии Android

private void getWifiInfo(Context context) {
    ConnectivityManager connManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
    Network[] networks = connManager.getAllNetworks();

    if(networks == null || networks.length == 0)
        return;

    for( int i = 0; i < networks.length; i++) {
        Network ntk = networks[i];
        NetworkInfo ntkInfo = connManager.getNetworkInfo(ntk);
        if (ntkInfo.getType() == ConnectivityManager.TYPE_WIFI && ntkInfo.isConnected() ) {
            final WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
            final WifiInfo connectionInfo = wifiManager.getConnectionInfo();
            if (connectionInfo != null) {
                // add some code here
            }
        }

    }
}

и добавить представление тоже

Вот что я использую в качестве служебного метода в своих приложениях:

public static boolean isDeviceOnWifi(final Context context) {
        ConnectivityManager connManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo mWifi = connManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
        return mWifi != null && mWifi.isConnectedOrConnecting();
}

Это более простое решение. См. Вопрос переполнения стека Проверка включения или выключения Wi-Fi на Android.

PS Не забудьте добавить код в файл manifest.xml, чтобы получить разрешение. Как показано ниже.

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

Вроде старый вопрос, но это то, что я использую. требуется минимальный уровень API 21, также учитывается устаревший API Networkinfo.

boolean isWifiConn = false;
    ConnectivityManager connMgr = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        Network network = connMgr.getActiveNetwork();
        if (network == null) return false;
        NetworkCapabilities capabilities = connMgr.getNetworkCapabilities(network);
        if(capabilities != null && capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)){
            isWifiConn = true;
            Toast.makeText(context,"Wifi connected Api >= "+Build.VERSION_CODES.M,Toast.LENGTH_LONG).show();
        }else{
            Toast.makeText(context,"Wifi not connected Api >= "+Build.VERSION_CODES.M,Toast.LENGTH_LONG).show();
        }
    } else {
        for (Network network : connMgr.getAllNetworks()) {
            NetworkInfo networkInfo = connMgr.getNetworkInfo(network);
            if (networkInfo.getType() == ConnectivityManager.TYPE_WIFI && networkInfo.isConnected()) {
                isWifiConn = true;
                Toast.makeText(context,"Wifi connected ",Toast.LENGTH_LONG).show();
                break;
            }else{
                Toast.makeText(context,"Wifi not connected ",Toast.LENGTH_LONG).show();
            }
        }
    }
    return isWifiConn;

Это работает с последними версиями Android:

      fun getConnectionType(context: Context): ConnectivityType {
    var result = NONE
    val cm = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager?
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        if (cm != null) {
            val capabilities = cm.getNetworkCapabilities(cm.activeNetwork)
            if (capabilities != null) {
                when {
                    capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI) -> {
                        result = WIFI
                    }
                    capabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR) -> {
                        result = MOBILE_DATA
                    }
                    capabilities.hasTransport(NetworkCapabilities.TRANSPORT_VPN) -> {
                        result = VPN
                    }
                }
            }
        }
    } else {
        if (cm != null) {
            val activeNetwork = cm.activeNetworkInfo
            if (activeNetwork != null) {
                // connected to the internet
                when (activeNetwork.type) {
                    ConnectivityManager.TYPE_WIFI -> {
                        result = WIFI
                    }
                    ConnectivityManager.TYPE_MOBILE -> {
                        result = MOBILE_DATA
                    }
                    ConnectivityManager.TYPE_VPN -> {
                        result = VPN
                    }
                }
            }
        }
    }
    return result
}

enum class ConnectivityType {
    NONE,
    MOBILE_DATA,
    WIFI,
    VPN,
}

И в манифесте:

          <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
val wifi = context!!.applicationContext.getSystemService(Context.WIFI_SERVICE) as WifiManager?        
         if (wifi!!.isWifiEnabled) 
              //do action here
    
         else 
             //do action here
    
        
                    

Вы можете включить WIFI, если он не активирован, как показано ниже: 1. проверьте состояние WIFI, ответив @Jason Knight 2. если не активировано, активируйте его, не забудьте добавить разрешение WIFI в файл манифеста

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

Ваш класс Java должен быть таким

public class TestApp extends Activity {
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    //check WIFI activation
    ConnectivityManager connManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo mWifi = connManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);

    if (mWifi.isConnected() == false) {
        showWIFIDisabledAlertToUser();
    }
    else {
        Toast.makeText(this, "WIFI is Enabled in your devide", Toast.LENGTH_SHORT).show();
    }
}


private void showWIFIDisabledAlertToUser(){
    AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(this);
    alertDialogBuilder.setMessage("WIFI is disabled in your device. Would you like to enable it?")
            .setCancelable(false)
            .setPositiveButton("Goto Settings Page To Enable WIFI",
                    new DialogInterface.OnClickListener(){
                        public void onClick(DialogInterface dialog, int id){
                            Intent callGPSSettingIntent = new Intent(
                                    Settings.ACTION_WIFI_SETTINGS);
                            startActivity(callGPSSettingIntent);
                        }
                    });
    alertDialogBuilder.setNegativeButton("Cancel",
            new DialogInterface.OnClickListener(){
                public void onClick(DialogInterface dialog, int id){
                    dialog.cancel();
                }
            });
    AlertDialog alert = alertDialogBuilder.create();
    alert.show();
}

}

Пытаться

wifiManager.getConnectionInfo().getIpAddress()

Это возвращает 0, пока устройство не имеет пригодного для использования соединения (на моей машине Samsung SM-T280, Android 5.1.1).

Добавьте это для JAVA:

public boolean CheckWifiConnection() {
        ConnectivityManager conMgr = (ConnectivityManager) getSystemService (Context.CONNECTIVITY_SERVICE);
        if (conMgr.getActiveNetworkInfo() != null
                && conMgr.getActiveNetworkInfo().isAvailable()
                && conMgr.getActiveNetworkInfo().isConnected()) {
            return true;
        } else {
            return false;
        }
    }

в файле манифеста добавьте следующие разрешения:

<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
Другие вопросы по тегам