Android 用于网络状态判断的NetworkCapabilities的3种解决方案

2023-11-02

前言

如今在Android 7.0版本以上判断网络是否可用,一般采用会ConnectivityManager.NetworkCallback,对其回调内NetworkCapabilities包含的TransportsCapabilities进行判断的方案,Android官方文档。经测试,有3中方案可行。

例如以下是一次状态回调包含的内容:

Transports: WIFI|VPN // 这个尤为重要
Capabilities:
NOT_METERED
&INTERNET
&NOT_RESTRICTED
&TRUSTED
&VALIDATED
&NOT_ROAMING
&FOREGROUND
&NOT_CONGESTED
&NOT_SUSPENDED
LinkUpBandwidth>=176231Kbps LinkDnBandwidth>=176231Kbps
AdministratorUids: []
RequestorUid: -1
RequestorPackageName: null


使用方法
// 在onResume调用
private void registerNetworkStatus() {
        Context context = getContext();
        if (context != null) {
            ConnectivityManager networkService = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
                networkService.registerDefaultNetworkCallback(networkCallback);
            } else {
                networkService.registerNetworkCallback(new NetworkRequest.Builder().build(), networkCallback);
            }
        }
    }

// 在onPause调用
private void unRegisterNetworkStatus() {
        Context context = getContext();
        if (context != null) {
            ConnectivityManager networkService = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
            networkService.unregisterNetworkCallback(networkCallback);
        }
    }

// 监听回调
private final ConnectivityManager.NetworkCallback networkCallback = new ConnectivityManager.NetworkCallback(){
        @Override
        public void onCapabilitiesChanged(@NonNull Network network, @NonNull NetworkCapabilities networkCapabilities) {
            super.onCapabilitiesChanged(network, networkCapabilities);
            Log.d(TAG, "onCapabilitiesChanged: 网络状态改变--->" + networkCapabilities.toString());
            if (NetworkUtils.isEnableToNetwork(getContext(), networkCapabilities)) {
                Log.d(TAG, "onCapabilitiesChanged ---> 网络可用");
            }
        }
    };

 /**
     * 检测网络连接状态是否可用,这里采用的第一种方案
     * 以下是可用网络: 
     *      NetworkCapabilities.TRANSPORT_CELLULAR,
     *      NetworkCapabilities.TRANSPORT_WIFI,
     *      NetworkCapabilities.TRANSPORT_BLUETOOTH,
     *      NetworkCapabilities.TRANSPORT_ETHERNET,
     *      NetworkCapabilities.TRANSPORT_VPN,
     *      NetworkCapabilities.TRANSPORT_WIFI_AWARE,
     *      NetworkCapabilities.TRANSPORT_LOWPAN
     */
    @SuppressLint("WrongConstant")
    public static boolean isEnableToNetwork(Context context, NetworkCapabilities networkCapabilities) {
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N) {
            if (context == null) return false;
            ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
            if (cm == null) return false;
                NetworkInfo mWiFiNetworkInfo = cm.getActiveNetworkInfo();
                return mWiFiNetworkInfo != null &&
                        (mWiFiNetworkInfo.getType() == ConnectivityManager.TYPE_WIFI || mWiFiNetworkInfo.getType() == ConnectivityManager.TYPE_MOBILE);
        } else {
            return networkCapabilities != null &&
                    networkCapabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
                    && networkCapabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED);
方案一、使用Capabilities

NetworkCapabilities.hasCapability()
在这里插入图片描述NetworkCapabilities

方案二、使用Transports

NetworkCapabilities.hasTransport()
以下都是可用的网络,根据实际需求使用(基本上所有情况都符合实际需求):

NetworkCapabilities.TRANSPORT_CELLULAR
NetworkCapabilities.TRANSPORT_WIFI
NetworkCapabilities.TRANSPORT_BLUETOOTH
NetworkCapabilities.TRANSPORT_ETHERNET
NetworkCapabilities.TRANSPORT_VPN
NetworkCapabilities.TRANSPORT_WIFI_AWARE
NetworkCapabilities.TRANSPORT_LOWPAN

在这里插入图片描述
在这里插入图片描述

方案三、使用LinkUpBandwidthLinkDnBandwidth

判断上下行的网络速率,如果不可用的话不会超过100kbps


另外提醒:hasCapability 和 hasTransport 不要用错了
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android 用于网络状态判断的NetworkCapabilities的3种解决方案 的相关文章

随机推荐

  • ESP32+INMP441+DHT11+OLED+网页+Arduino——“智能”语音天气站(2):INMP441录音生成wav文件

    参考视频 Recording using INMP441 参考代码 学会了代码复用 Recording using INMP441 知识 什么是wav文件 可以在维基百科找到wav文件的历史渊源 这个网站有一个详尽的wav格式说明 wav格
  • PyTorch基础系列(三)——深入理解autograd:Variable属性方法【最新已经和tensor合并为一类】

    torch autograd backward variables grad variables retain variables False 当前Variable对leaf variable求偏导 计算图可以通过链式法则求导 如果Vari
  • 高德地图:缺少定位权限(实际上权限已经打开)

    使用高德地图 获取定位的过程中 出现以下问题 ErrorCode 12 errorInfo 缺少定位权限 请到http lbs amap com api android location sdk guide utilities errorc
  • idea远程调试

    一 业务 服务器与本地环境不一样 二 需求 如果服务器报错 使用本地idea进行远程debug调试 三 解决方案 本地idea远程debug调试 四 具体操作 1 第一步 IDEA打开远程启动的springboot应用程序所对应的本地spr
  • 剑指Offer - 面试题10:斐波那契数列

    题目一 求斐波那契数列的第n项 写一个函数 输入n 求斐波那契 Fibonacci 数列的第n项 斐波那契数列的定义如下 分析 递归法 给出的公式用递归是最简单的 但是也是效率很低的 C include
  • 电磁波的发射和接收

    电磁波的发射和接收 作者 佚名 教案来源 网络 点击数 2628 电磁波的发射和接收 本资料为WORD文档 请点击下载地址下载 全文下载地址 文章 来源莲山 课 件 w w w 5y K J Co m 14 3 电磁波的发射和接收 教学目标
  • 计算机网络-15 网络测量

    第十五讲 网络测量 概述 定义 按照一定方法和技术 使用硬件或软件来量度网络运行状态 表征网络特性的一系列活动的总和 应用 监测网络故障 测试协议行为 刻画流量特征 评估网络性能 几个重大发现 协议方面 TCP协议占了大部分网络流量 流量方
  • AVL 平衡二叉搜索树 支持键值 简介+实现

    为什么要平衡 什么是平衡 平衡因子 不平衡的情况和平衡的方法 LL RR LR RL 删除操作 实现 AVL是发明这个算法的两个大神 Adelson Velsky and Landis 的名字首字母 为什么要平衡 一般的搜索树 如果元素是顺
  • ggplot2 画分面的柱状图

    ggplot2 画分面的柱状图 直接上代码 df read table class txt header TRUE ggplot data df mapping aes x factor samples y y fill class geo
  • yaml配置文件

    最近在写代码 发现随着网络的增加 代码变得越来越冗余 所以就想着写一个网络的配置文件 把网络的配置放到一个文件中 而不再主函数中 这样代码开起来就好看了 调试的时候也方便了 之前写过一篇神经网络配置文件的文章 config配置文件原理及使用
  • 一个Mini的ASP.NET Core框架的实现

    转自 https www cnblogs com edisonchou p aspnet core mini implemention introduction html 一 ASP NET Core Mini 在2019年1月的微软技术
  • SHA 和 RSA 的区别

    SHA VS RSA 它们之间有什么区别 SHA 和 RSA 有什么区别 它们只是不同的算法还是在某种程度上从根本上 即用于不同事物 不同 原文来自于 stackoverflow https stackoverflow com questi
  • VMware虚拟机 客户机是Linux的情况下客户机ping VMware网关,ping不通

    VMware虚拟机 客户机是Linux的情况下客户机ping VMware网关 ping不通的情况下 宿主机笔者这里是使用的win7 把宿主机的防火墙关闭即可 补充 VMware虚拟机安装成功后 网络适配器会多出来两个 gt VMnet1
  • 一个例子告诉你什么是封装,继承和多态(C++ 代码实例) (一)

    add by WJB date 2018 08 30 面向对象的三大特性 封装 继承和多态 封装 将事物拥有的属性和动作隐藏起来 只保留特定的方法与外界联系 继承 子类可以拥有父类的属性和方法 多态 以说是 一个接口 多种实现 或者说是父类
  • php伪协议漏洞_php伪协议小结(文件包含)

    继续转发我的csdn 文章目录 闲扯 file php data http https zip compress bzip2 compress zlib phar 闲扯 长期挖不到文件包含漏洞 导致每次挖洞都不太会去注意这一方面 发现刚开始
  • vmware15.5.0安装Ubuntu18.04.5详细配置

    软件版本 vmware 15 5 0 Ubuntu 18 04 5 步骤 创建新的虚拟机 不想太复杂推荐用典型就好 稍后安装操作系统 下一步选择Linux系统 版本为Ubuntu64位 选择安装位置 分配虚拟机内存 建议30GB起步 点击自
  • DMA基本概念与常见寄存器设置

    什么是DMA DMA Direct Memory Access 即直接存储访问 DMA传输方式无需CPU直接控制传输 通过硬件为RAM I O设备开辟一条直接传输数据的通路 能使CPU的效率大为提高 每一种体系结构DMA传输不同 编程接口也
  • 【登陆harbor仓库报错——解决方法】Error response from daemon:Get... http: server gave HTTP response to HTTs client

    大家好 我是好学的小师弟 今天和大家分享下我在部署harbor的过程中遇到的一些问题的解决方法 问题 通过服务器docker登录harbor 发现登陆报错 Error response from daemon Get https v2 ht
  • “AI绘图工具能否取代设计师:现状与展望“

    近年来 人工智能的出现和不断发展已经给我们带来了非常多的便利和改变 包括在图像领域 出现了许多针对普通用户的AI绘图工具 如Midjourney等 这些工具标榜着可以让没有美术基础的人也能快速上手制作出漂亮的图像 当然 这些技术的出现不可避
  • Android 用于网络状态判断的NetworkCapabilities的3种解决方案

    前言 如今在Android 7 0版本以上判断网络是否可用 一般采用会ConnectivityManager NetworkCallback 对其回调内NetworkCapabilities包含的Transports或Capabilitie