Android 网络判断

网络判断方法

        val connectivityManager =
            context.getSystemService(Context.CONNECTIVITY_SERVICE) as? ConnectivityManager
        val activeNetwork: Network? = connectivityManager?.activeNetwork
        if (activeNetwork != null) {
            val networkCapabilities = connectivityManager.getNetworkCapabilities(activeNetwork)
            val linkProperties = connectivityManager.getLinkProperties(activeNetwork)
            val isInternetAvailable =
                networkCapabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
            val isValidated =
                networkCapabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED)
            GwmLogUtils.i(
                "NetworkCheckInterceptor",
                "isInternetAvailable:$isInternetAvailable,isValidated:$isValidated"
            )
            if (networkCapabilities != null
                && isInternetAvailable
                && isValidated
            ) {
                GwmLogUtils.i("NetworkCheckInterceptor", "网络支持互联网访问")
                if (linkProperties != null) {
                    val ipAddresses = linkProperties.linkAddresses
                    for (ipAddress in ipAddresses) {
                        val hostAddress = ipAddress.address.hostAddress
                        GwmLogUtils.i(
                            "NetworkCheckInterceptor",
                            "IP地址:${hostAddress ?: "未知"}"
                        )
                    }
                    val dnsServers = linkProperties.dnsServers
                    for (dnsServer in dnsServers) {
                        GwmLogUtils.i(
                            "NetworkCheckInterceptor",
                            "DNS服务器: ${dnsServer ?: "未知"}"
                        )
                    }
                }
            } else {
                GwmLogUtils.i("NetworkCheckInterceptor", "网络不支持互联网访问")
                throw SocketTimeoutException("网络不支持互联网访问,请检查网络设置")
            }
        } else {
            GwmLogUtils.i("NetworkCheckInterceptor", "没有活动网络")
            throw SocketTimeoutException("当前无网络连接,请检查网络设置")
        }

对比

  1. 精准度和信息丰富度
    • networkInfo.isConnected
      • 这是一个相对简单的判断方法,它主要用于确定设备是否与网络建立了连接。如果返回true,仅表示设备已经连接到某个网络,但是无法提供更多关于网络的细节信息,比如网络是否能够访问互联网、网络的类型(Wi - Fi还是移动数据)、网络的具体属性(IP地址、DNS服务器等)。例如,当设备连接到一个被限制访问的Wi - Fi网络(如需要登录认证但尚未完成认证)时,isConnected可能返回true,但实际上网络并不能正常使用。
    • ConnectivityManager.getNetworkCapabilitiesConnectivityManager.getLinkProperties结合使用
      • 这种方式能够提供更精准的网络状态判断和更丰富的网络信息。getNetworkCapabilities可以判断网络是否真正具备访问互联网的能力,还能确定网络的传输类型(如Wi - Fi、蜂窝网络等)以及是否经过验证等细节。getLinkProperties则可以获取网络链路的详细属性,如IP地址、DNS服务器地址等。通过这两个方法的结合,可以全面了解网络的实际可用性和具体特征。
  2. 更新及时性和准确性
    • networkInfo.isConnected
      • 它是基于NetworkInfo对象的一个同步判断方法。在网络状态快速变化的场景下,可能无法及时更新状态,导致判断结果不够准确。例如,当设备从一个Wi - Fi网络切换到移动数据网络时,isConnected的更新可能会有延迟,不能立即反映网络连接的真实变化。
    • ConnectivityManager.getNetworkCapabilitiesConnectivityManager.getLinkProperties结合使用
      • 可以更及时、准确地反映网络状态。ConnectivityManager提供了一些异步监听网络状态变化的机制,如NetworkCallback。通过注册NetworkCallback,可以在网络状态发生变化时及时获取最新的Network对象,然后使用getNetworkCapabilitiesgetLinkProperties获取最新的网络信息,从而保证网络状态判断的及时性和准确性。
  3. 适应复杂网络场景的能力
    • networkInfo.isConnected
      • 在一些复杂的网络场景下表现不佳。例如,在企业网络环境中,可能存在虚拟专用网络(VPN)、代理服务器等情况,isConnected只能简单判断设备是否连接到网络,无法确定这些复杂网络配置下网络是否真正可用或者网络的具体工作方式。
    • ConnectivityManager.getNetworkCapabilitiesConnectivityManager.getLinkProperties结合使用
      • 能够更好地适应复杂网络场景。可以通过getNetworkCapabilities判断网络是否通过VPN连接(通过检查是否有相关能力属性),通过getLinkProperties获取代理服务器相关信息(如果存在),从而更准确地了解网络在复杂场景下的实际情况。

更多


https://blog.csdn.net/liuning1985622/article/details/138542838

public class ConnectivityManager {
    public interface OnNetworkActiveListener {
        void onNetworkActive(); 网络处于活动状态
    }
    public static class NetworkCallback {
        void onPreCheck(@NonNull Network network) {} 当框架连接到新网络以评估它是否满足此请求时。
        void onAvailable(@NonNull Network network) {} 当框架连接并声明新网络可供使用时调用。
        void onLosing(@NonNull Network network, int maxMsToLive) {} 在网络即将丢失时调用,通常是因为没有未完成的请求。
        void onLost(@NonNull Network network) {} 当网络断开连接或不再满足此请求或回调时调用。
        void onUnavailable() {} 如果在调用中指定的超时时间内未找到网络,或者无法满足请求的网络请求(无论是否指定了超时),则调用。
        void onCapabilitiesChanged(@NonNull Network network, @NonNull NetworkCapabilities  networkCapabilities) {} 当与此请求对应的网络更改功能但仍满足请求的条件时调用。
        void onLinkPropertiesChanged(@NonNull Network network, @NonNull LinkProperties linkProperties) {} 当与此请求对应的网络更改时调用
        void onNetworkSuspended(@NonNull Network network) {} 当为此请求连接到的网络暂时暂停数据传输时调用。
        void onNetworkResumed(@NonNull Network network) {} 当为此请求连接到的网络从USPENDED状态返回时调用。
        void onBlockedStatusChanged(@NonNull Network network, boolean blocked) {} 在阻止或取消阻止对指定网络的访问时调用。
        void onBlockedStatusChanged(@NonNull Network network, @BlockedReason int blocked) {} 在阻止或取消阻止对指定网络的访问时调用。
    }
    private class CallbackHandler extends Handler {
    public void handleMessage(Message message) {}
    }
}
public final class NetworkCapabilities implements Parcelable {
    public @interface NetCapability { 
        NET_CAPABILITY_MMS:指示这是一个能够访问运营商的 MMSC 以发送和接收彩信的网络。
        NET_CAPABILITY_SUPL:指示这是一个能够访问运营商的 SUPL 服务器的网络,用于检索 GPS 信息。
        NET_CAPABILITY_DUN:表示这是一个能够访问运营商的 DUN 或网络共享网关的网络。
        NET_CAPABILITY_FOTA:表示这是一个能够访问运营商FOTA门户的网络,用于无线更新。
        NET_CAPABILITY_IMS:指示这是一个能够访问运营商的 IMS 服务器的网络,用于网络注册和信令。
        NET_CAPABILITY_CBS:指示这是一个能够访问运营商的 CBS 服务器的网络,用于运营商特定的服务。
        NET_CAPABILITY_WIFI_P2P:指示这是一个能够到达 Wi-Fi 直接对等方的网络。
        NET_CAPABILITY_IA:指示这是一个能够访问运营商的初始连接服务器的网络。
        NET_CAPABILITY_RCS:指示这是一个能够访问运营商的 RCS 服务器(用于富通信服务)的网络。
        NET_CAPABILITY_XCAP:表示这是一个能够访问运营商的 XCAP 服务器(用于配置和控制)的网络。
        NET_CAPABILITY_EIMS:表示这是一个能够访问运营商的紧急 IMS 服务器或其他服务的网络,用于在紧急呼叫期间发出网络信令。
        NET_CAPABILITY_NOT_METERED:指示此网络不按流量计费。
        NET_CAPABILITY_INTERNET:指示此网络应该能够访问互联网。
        NET_CAPABILITY_NOT_RESTRICTED:指示此网络可用于常规用途。
        NET_CAPABILITY_TRUSTED:指示用户已指示对此网络的隐式信任。
        NET_CAPABILITY_NOT_VPN:指示此网络不是 VPNNET_CAPABILITY_VALIDATED:指示已成功验证此网络上的连接。
        NET_CAPABILITY_CAPTIVE_PORTAL:指示上次探测此网络时发现此网络具有强制网络门户。
        NET_CAPABILITY_NOT_ROAMING:指示此网络未漫游。
        NET_CAPABILITY_FOREGROUND:指示此网络可供应用使用,而不是在后台保持以便于快速网络切换的网络。
        NET_CAPABILITY_NOT_CONGESTED:指示此网络未拥塞。
        NET_CAPABILITY_NOT_SUSPENDED:指示此网络当前未挂起。
        NET_CAPABILITY_OEM_PAID:指示通过此网络的流量由 OEM 支付。例如,系统应用可以使用此网络上传遥测数据。
        NET_CAPABILITY_MCX:指示这是一个能够访问运营商的关键任务服务器的网络。
        NET_CAPABILITY_PARTIAL_CONNECTIVITY:指示此网络经过测试,仅提供部分连接。
        NET_CAPABILITY_TEMPORARILY_NOT_METERED:指示此网络暂时不按流量计费。
        NET_CAPABILITY_OEM_PRIVATE:指示此网络是 OEM 专用的,仅供 OEM 使用。
        NET_CAPABILITY_VEHICLE_INTERNAL:表示这是一个内部车辆网络,用于与其他汽车系统通信。
        NET_CAPABILITY_NOT_VCN_MANAGED:指示此网络未包含在虚拟运营商网络 (VCN) 中。
        NET_CAPABILITY_ENTERPRISE:指示此网络供企业使用。
        NET_CAPABILITY_VSIM:表示此网络能够访问运营商的虚拟 Sim 服务。
        NET_CAPABILITY_BIP:指示此网络能够支持承载独立 ProtolNET_CAPABILITY_HEAD_UNIT:指示此网络已连接到汽车音响主机。
        NET_CAPABILITY_MMTEL:指示此网络能够支持 MMTEL(多媒体电话服务)。
        NET_CAPABILITY_PRIORITIZE_LATENCY:指示此网络应该能够确定互联网延迟的优先级。
        NET_CAPABILITY_PRIORITIZE_BANDWIDTH:指示此网络应能够确定互联网带宽的优先级。
    }
    public @interface Transport { 
        TRANSPORT_CELLULAR:指示此网络使用手机网络传输。
        TRANSPORT_WIFI:指示此网络使用 Wi-Fi 传输。
        TRANSPORT_BLUETOOTH:指示此网络使用蓝牙传输。
        TRANSPORT_ETHERNET:指示此网络使用以太网传输。
        TRANSPORT_VPN:指示此网络使用 VPN 传输。
        TRANSPORT_WIFI_AWARE:指示此网络使用 Wi-Fi 感知传输。
        TRANSPORT_LOWPAN:指示此网络使用 LoWPAN 传输。
        TRANSPORT_TESTTRANSPORT_USB:指示此网络使用 USB 传输。
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

周周都刷火焰猫头鹰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值