当前位置: 首页 > article >正文

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 传输。
    }
}

http://www.kler.cn/a/466361.html

相关文章:

  • v-model与 mvvm 回顾
  • java并发之AQS
  • MetaGPT - 多Agent框架
  • Navicat 17 for Mac 数据库管理软件
  • 软件工程实验-实验2 结构化分析与设计-总体设计和数据库设计
  • docker Error response from daemon
  • Couchbase 的 OLAP 能力现状以及提升 OLAP 能力的方法
  • Android:动态去掉RecyclerView动画导致时长累加问题解决
  • 【蓝桥杯比赛-C++组-经典题目汇总】
  • cka考试-03-k8s版本升级
  • SpringBootWeb案例-2
  • 图形 3.5 Early-z和Z-prepass
  • Mysql监视器搭建
  • FPGA、STM32、ESP32、RP2040等5大板卡,结合AI,更突出模拟+数字+控制+算法
  • 仓储机器人底盘的研究
  • 在Microsoft Windows上安装MySQL
  • 2025年第五届控制理论与应用国际会议 | Ei Scopus双检索
  • 「Mac畅玩鸿蒙与硬件53」UI互动应用篇30 - 打卡提醒小应用
  • Chapter2 文本规范化
  • #C02L02P01. C02.L02.一维数组最值问题.知识点1.求最大值
  • Elasticsearch:利用 AutoOps 检测长时间运行的搜索查询
  • 【2025最新计算机毕业设计】基于SpringBoot+Vue智慧养老医护系统(高质量源码,提供文档,免费部署到本地)【提供源码+答辩PPT+文档+项目部署】
  • unity学习2:关于最近github的2FA(two-factor authentication)新认证
  • 深入理解正则表达式及基本使用教程
  • 图像转换 VM与其他格式互转
  • CLIP论文笔记