You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何利用现有isConnected方法实现网络服务状态检查?

优化后的Android网络连接状态检测方案

首先得说,你现有的这个检测方法思路是对的,但有两个小问题需要修正:一是逻辑判断的优先级可能导致结果不准确,二是用到的getNetworkInfo(int type)在Android 6.0(API 23)之后已经被官方废弃了,高版本系统上可能会出现兼容性问题。我帮你补全并优化一下代码:

原代码的核心问题点

  • 逻辑判断优先级问题:原代码里mobile.isAvailable() || wifi.isAvailable() && netInfo.isConnected()会先执行&&再执行||,这意味着只要移动网络可用,不管是否真的连接上都会返回true,不符合“已连接可用网络”的实际需求
  • 废弃API问题:getNetworkInfo(int type)已被官方标记为废弃,高版本系统推荐使用NetworkCapabilitiesAPI来做更精准的网络状态判断

兼容高低版本的完整实现

第一步:声明必要权限

先确保在AndroidManifest.xml里添加网络状态权限:

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

第二步:完整的检测方法

public boolean isConnected(Context context) {
    ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
    if (cm == null) {
        // 系统服务获取失败,直接判定无网络连接
        return false;
    }

    // 适配Android 6.0及以上高版本系统
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        Network network = cm.getActiveNetwork();
        if (network == null) {
            return false;
        }
        NetworkCapabilities capabilities = cm.getNetworkCapabilities(network);
        // 检查是否存在可用的互联网连接(支持WiFi、移动网络、以太网等类型)
        return capabilities != null 
                && (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)
                    || capabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)
                    || capabilities.hasTransport(NetworkCapabilities.TRANSPORT_ETHERNET))
                && capabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET);
    } else {
        // 适配Android 6.0以下低版本系统
        NetworkInfo netInfo = cm.getActiveNetworkInfo();
        if (netInfo == null) {
            return false;
        }
        // 严格判断:网络已连接且可用
        return netInfo.isConnected() && netInfo.isAvailable();
    }
}

关键逻辑说明

  • 高版本适配:用NetworkCapabilities不仅能覆盖WiFi和移动网络,还支持以太网等小众网络类型,同时明确检查网络是否具备互联网访问能力,比旧API更精准
  • 低版本兼容:保留旧API的使用,但修正了判断逻辑,确保只有当网络已连接且可用时才返回true
  • 空值防护:增加了系统服务、网络信息的空值判断,避免运行时出现空指针异常

如果你只需要针对WiFi和移动网络做检测,也可以在高版本的判断里去掉TRANSPORT_ETHERNET的检测项。

内容的提问来源于stack exchange,提问作者user8940426

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 06:40:30