如何在安卓系统中查看Wi-Fi是否已连接?

255

我不希望用户在没有连接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已连接,我仍然在获取IP地址时得到OBTAINING_IPADDR的状态。


1
2021年工作解决方案:https://stackoverflow.com/questions/66573565/android-get-status-of-wifi-connection/66648761 - Sam Chen
24个回答

3
使用 WifiManager,您可以执行以下操作:
WifiManager wifi = (WifiManager) getSystemService (Context.WIFI_SERVICE);
if (wifi.getConnectionInfo().getNetworkId() != -1) {/* connected */}

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

WIFI_STATE_DISABLED 常量值:1(0x00000001) WIFI_STATE_DISABLING 常量值:0(0x00000000)WIFI_STATE_ENABLED 常量值:3(0x00000003)WIFI_STATE_ENABLING 常量值:2(0x00000002)WIFI_STATE_UNKNOWN 常量值:4(0x00000004) - Lou Morda
https://developer.android.com/reference/android/net/wifi/WifiManager.html - Lou Morda
在Android Q中,如果未开启位置权限和位置模式,则此功能将不再起作用,请参见 https://issuetracker.google.com/issues/136021574。 - Konsumierer

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

1
最好添加一些解释而不是只添加代码。 - EdChum
2
我会使用 ***isConnected()***,文档中说:boolean isConnectedOrConnecting () 表示网络连接是否存在或正在建立过程中。这对于需要进行与网络相关的任何操作的应用程序非常有用,除了读取或写入数据之外。对于后者,请调用 isConnected(),它保证网络完全可用。 - 18446744073709551615

2
与@Jason Knight的回答类似,但以Kotlin方式实现:最初的回答
val connManager = getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
val mWifi = connManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI)

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

ConnectivityManager.TYPE_WIFI已经被弃用。 - Jérôme Pietri

2
这对我有效:
    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

尝试使用这种方法。

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

这种方法可以帮助判断互联网连接是否可用。


1
我特别查看活动连接是否为wifi。此外,无需对conMgr进行空值检查,因为它永远不会为空。 - Nathan Schwermann
你能帮忙看一下这个问题吗?:( - Skizo-ozᴉʞS ツ

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

指出 isConnectedOrConnecting 方法在检查建立连接时非常重要。IsConnected 方法对我没有起作用。 - vincent

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

    }
}

而且还要添加权限


connManager.getAllNetworks() 需要 API 级别 21。 - Jawand Singh

0

尝试

wifiManager.getConnectionInfo().getIpAddress()

这会在设备有可用连接之前返回0(在我的机器上,三星SM-T280,Android 5.1.1)。


0

这是一个更简单的解决方案。请参考 Stack Overflow 上的问题 如何检查 Android 是否启用 Wi-Fi

另外,别忘了在 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>

0

这是一个有点老的问题,但这是我使用的方法。需要最低API级别21,还要考虑到已弃用的Networkinfo API。

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;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接