如何查看Android上是否连接了Wi-Fi?

如何查看Android上是否连接了Wi-Fi?,android,android-wifi,wifimanager,Android,Android Wifi,Wifimanager,我不希望我的用户尝试下载东西,除非他们连接了Wi-Fi。然而,我似乎只能判断是否启用了Wi-Fi,但他们仍然可以连接3G android.net.wifi.WifiManager m = (WifiManager) getSystemService(WIFI_SERVICE); android.net.wifi.SupplicantState s = m.getConnectionInfo().getSupplicantState(); NetworkInfo.DetailedState sta

我不希望我的用户尝试下载东西,除非他们连接了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,我也会获取状态为
获取\u IPADDR

您应该能够使用ConnectionManager获取Wi-Fi适配器的状态。从那里你可以

注意:应该注意(对于我们这里的N00BIE),您需要添加

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

给你

AndroidManifest.xml以使其正常工作

注2:现已弃用:

此方法在API级别23中被弃用。这种方法不适用 支持同一类型的多个连接网络。使用 改为getAllNetworks()和getNetworkInfo(android.net.Network)

注3:现在已弃用:

此常量在API级别28中被弃用。 应用程序应改为使用NetworkCapabilities.hasTransport(int)或requestNetwork(NetworkRequest,NetworkCallback)来请求适当的网络。用于支持的传输


我只使用以下方法:

SupplicantState supState; 
wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);
WifiInfo wifiInfo = wifiManager.getConnectionInfo();
supState = wifiInfo.getSupplicantState();
它将在调用getSupplicantState()时返回这些状态之一

关联-关联已完成

关联-尝试与关联 接入点

已完成-所有身份验证 完成

已断开-此状态表示 该客户机没有关联,但是 可能会开始寻找访问权限 重点

休眠-安卓添加的状态 当客户端发出 显式断开连接命令

四向握手-WPA四向键 握手进行中

组握手-WPA组密钥 握手进行中

非活动-非活动状态

无效-应为的伪状态 通常是看不见的

扫描-扫描网络

未初始化-没有连接

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

我看了一些类似的问题,得出了以下结论:

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
}

我在Root Toolbox PRO中使用if进行许可证检查,它似乎工作得很好。

我在应用程序中使用它来检查活动网络是否为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

}
试试这个方法

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;
}
此方法将有助于查找可用或不可用的internet连接。

此方法适用于我:

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

使用
WifiManager
可以执行以下操作:

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

该方法仅在未连接到网络时返回-1

以下是我在应用程序中使用的实用方法:

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

这是一个更简单的解决方案。请参阅堆栈溢出 问题

请注意,不要忘记将代码添加到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>

虽然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-23中的方法NetworkInfo.isConnected()现在已被弃用了,因此这里有一种方法可以检测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
    }
}
试一试


这将返回0,直到设备具有可用连接(在我的机器上,三星SM-T280,安卓5.1.1上)。

如果未按以下方式激活WIFI,则可以打开WIFI 1.检查@Jason Knight回复的WIFI状态 2.如果未激活,请激活它 不要忘记在清单文件中添加WIFI权限

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

在新版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
            }
        }

    }
}
private void getWifiInfo(上下文){
ConnectivityManager connManager=(ConnectivityManager)context.getSystemService(context.CONNECTIVITY_服务);
Network[]networks=connManager.getAllNetworks();
if(networks==null | | networks.length==0)
返回;
对于(int i=0;i

并添加类似于@Jason Knight answer的前置任务,但以Kotlin的方式:

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

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

许多答案使用不推荐使用的代码,或更高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;
以下代码(在Kotlin中)从API 21一直工作到至少当前的API版本(API 29)。 函数getWifiState()返回WiFi网络状态的三个可能值之一: 禁用、启用枚举类中定义的NotConnected和Connected。 这允许做出更精细的决定,比如通知用户启用WiFi,或者,如果已经启用,则连接到一个可用网络。 但是,如果只需要一个布尔值来指示WiFi接口是否连接到网络,那么另一个函数是wificonnected(),它将为您提供该值。它使用上一个并将结果与连接的进行比较

它的灵感来源于之前的一些答案,但试图解决Android API的发展或IP V6的可用性缓慢增加带来的问题。 诀窍是使用:

wifiManager.connectionInfo.bssid != null 
而不是:

  • getIpAddress()==0,仅对IP V4或
  • getNetworkId()==-1,现在需要另一个特殊权限(位置)
  • 根据文件: 如果未连接到网络,它将返回null。即使我们没有获取实际值的权限,如果我们连接,它仍然会返回null以外的值

    还要记住以下几点:

    android之前的版本
    val connManager = getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
    val mWifi = connManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI)
    
    if (mWifi.isConnected) {
         // Do whatever
    }
    
    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;
    
    wifiManager.connectionInfo.bssid != null 
    
    <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)
        }
    }
    
    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;
    }
    
    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" />
    
    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;
    
    val wifi = context!!.applicationContext.getSystemService(Context.WIFI_SERVICE) as WifiManager?        
             if (wifi!!.isWifiEnabled) 
                  //do action here
        
             else 
                 //do action here
        
            
                        
    
    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" />