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

Nat*_*ann 234 android wifimanager android-wifi

除非他们连接了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;
}
Run Code Online (Sandbox Code Playgroud)

然而,国家不是我所期望的.即使连接了Wi-Fi,我也会OBTAINING_IPADDR成为状态.

Jas*_*ght 461

您应该能够使用ConnectivityManager来获取Wi-Fi适配器的状态.从那里你可以检查它是否已连接或甚至可用.

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

if (mWifi.isConnected()) {
    // Do whatever
}
Run Code Online (Sandbox Code Playgroud)

注意:应该注意(对于我们这里的n00bies)你需要添加

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
Run Code Online (Sandbox Code Playgroud)

到你的

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)来请求适当的网络.支持运输.

  • 应该注意(对于我们这里的noobies)你需要将`android.permission.ACCESS_NETWORK_STATE`添加到你的AndroidManifest.xml才能使用. (72认同)
  • 在Android的最新版本中,您需要在mWiFi中检查NULL ...这里的代码可能会抛出空指针错误.请参阅http://developer.android.com/training/basics/network-ops/managing.html,特别是"方法getActiveNetworkInfo()返回一个NetworkInfo ..." (10认同)
  • NetworkInfo.isConnected()方法现在在API-23中被删除.我在下面发布一个解决方案. (3认同)
  • [NetworkInfo.getType()](https://developer.android.com/reference/android/net/NetworkInfo#getType()) 和 [ConnectivityManager.TYPE_WIFI](https://developer.android.com/reference/android /net/ConnectivityManager#TYPE_WIFI) 现在已在 API 28 中弃用。为避免 lint 警告,您应该使用类似`connectivityManager.getNetworkCapabilities(network).hasTransport(NetworkCapabilities.TRANSPORT_WIFI)` (2认同)

rev*_*ary 68

由于现在在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
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 值得一提的是,wifiInfo可以为null,所以我认为你应该在获取网络ID之前检查null (4认同)
  • [`NetworkInfo.isConnected()`](https://developer.android.com/reference/android/net/NetworkInfo.html#isConnected())对我来说不会弃用. (2认同)
  • 不要忘记添加权限:`android.permission.ACCESS_WIFI_STATE` (2认同)

Don*_*rty 35

我只是使用以下内容:

SupplicantState supState; 
wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);
WifiInfo wifiInfo = wifiManager.getConnectionInfo();
supState = wifiInfo.getSupplicantState();
Run Code Online (Sandbox Code Playgroud)

在调用getSupplicantState()时,将返回其中一个状态;

相关 - 协会已完成.

关联 - 尝试与接入点关联.

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

DISCONNECTED - 此状态表示客户端未关联,但可能开始寻找接入点.

DORMANT - 客户端发出显式DISCONNECT命令时报告的Android添加状态.

FOUR_WAY_HANDSHAKE - WPA四向键握手正在进行中.

GROUP_HANDSHAKE - WPA组密钥握手正在进行中.

不活跃 - 非活动状态.

INVALID - 通常永远不会被看到的伪状态.

扫描 - 扫描网络.

无限制 - 没有联系.

  • 即使我不在wifi上,它仍然显示为"已完成" (2认同)

kuc*_*chi 18

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

}
Run Code Online (Sandbox Code Playgroud)


小智 17

我看了几个像这样的问题并提出了这个问题:

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
}
Run Code Online (Sandbox Code Playgroud)

我使用if for我的许可证检查Root Toolbox PRO,它似乎工作得很好.

  • 看起来不错,但我不确定为什么你得到第二个连接到ConnectivityManager.在此示例中,connManager和connManager1都是相同的Object (8认同)

Val*_*nez 6

虽然Jason的答案是正确的,但现在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;
}
Run Code Online (Sandbox Code Playgroud)


jac*_*314 6

NetworkInfo此类已废弃的API级别29,与相关接入方式等一起ConnectivityManager#getNetworkInfo()ConnectivityManager#getActiveNetworkInfo()

文档现在建议人们使用ConnectivityManager.NetworkCallbackAPI的异步回调监控,或使用ConnectivityManager#getNetworkCapabilitiesConnectivityManager#getLinkProperties对网络信息的同步访问

调用者应改为使用 ConnectivityManager.NetworkCallback API 来了解连接更改,或切换到使用 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
}
Run Code Online (Sandbox Code Playgroud)

爪哇:

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;
}
Run Code Online (Sandbox Code Playgroud)

请记住还要ACCESS_NETWORK_STATE为您的清单文件添加权限。