iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > PHP编程 >Android 获取网络连接状态新方法
  • 638
分享到

Android 获取网络连接状态新方法

Android获取网络状态Android获取连接网络类型 2023-09-09 14:09:06 638人浏览 独家记忆
摘要

一. 问题背景         Android12上,有的app模块判断当前网络的类型和连接状态时,还是使用的旧的api,导致返回的结果不准确,影响代码逻辑判断,本篇文章就这一问题,整理一下判断网络类型和连接状态的新方法。 二. 原因分

一. 问题背景

        Android12上,有的app模块判断当前网络的类型和连接状态时,还是使用的旧的api,导致返回的结果不准确,影响代码逻辑判断,本篇文章就这一问题,整理一下判断网络类型和连接状态的新方法。

二. 原因分析

        在Android 10以前的版本,大家都是通过NetworkInfo.java 的getType()方法获取网络类型,通过isConnected()方法来判断是否连接上, 判断网络连接的旧方法如下:

是否连接:

 2. 网络类型

 但是在Android10之后,这些方法已过时,官方不推荐使用,我们先来看下官方的源码说明

 左边是Android10,右边是Android9的源码 ,   在10上已经标记Deprecated,新加的注释也推荐了使用的API

还有一个旧广播String CONNECTIVITY_ACTioN = "android.net.conn.CONNECTIVITY_CHANGE"  Android 9之后也废弃,不推荐使用,之前的使用方法:

看下官方说明:

 官方标记Deprecated,是避免在高版本的设备上获取返回的网络状态不对,并且给了推荐的API,以Android10为一个分界点, 之后的版本都推荐使用新的API方法。

三. 官方推荐API

官方推荐:监控 Android 中的互联网连接,可以使用ConnectivityManager类,这是一个允许您查询网络状态的系统服务类,   还有一个NetworkCapabilities类,代表活动网络的功能。

体使用方法如下:

reGISterNetworkCallback():此函数注册一个NetworkCallback对象来监听网络状态变化。它以一个NetworkCallback对象作为参数。

unregisterNetworkCallback():此函数取消注册以前注册的NetworkCallback对象。

接下来重点关注NetworkCallback中的回调方法描述

回调方法

描述

onCapabilitiesChanged

当网络状态改变时回调,比如信号强度切换,或者连接上网络—>断开网络,或者 mobile网络切换到Wifi网络,都会回调

onAvailable

网络连接成功 但不能判断该网络是否可以正常上网

onUnavailable

当网络连接超时或网络请求达不到可用要求时调用

onBlockedStatusChanged

当访问指定的网络被阻止或解除阻塞时调用

onLosing

当网络正在断开连接时调用

onLost

当网络已断开连接时调用

onLinkPropertiesChanged

当网络连接的属性被修改时调用

接下来再说一下

NetworkCapabilities.java类中的NET_CAPABILITY_VALIDATED字段,描述为:

表示此网络上的连接已成功验证。例如,对于具有NET_CAPABILITY_INTERNET的网络,这意味着已成功检测到INTERNET连接。

通过实际log来描述说明一下:

1. 连接上可上网的wifi,可看到VALIDATED的标记:

 连接上需要认证和不能上网的wifi,找不到VALIDATED标记:

 3. 用数据流量上网,可以看到VALIDATED的标记:

我们可以通过networkCapabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED)这个方法作为(连接可以正常上网的网络)判断条件。进一步通过networkCapabilities.hasTransport方法来判断当前的网络类型。

四. 使用方法

看代码更直接一点:

MainActivity.java

@SuppressLint("NewApi")public class MainActivity extends AppCompatActivity {    private static final String TAG = "ConnectManager";    private ConnectivityManager networkService;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        networkService = (ConnectivityManager) this.getSystemService(Context.CONNECTIVITY_SERVICE);        if (networkService != null) {            //注册 NetworkCallBack            networkService.registerDefaultNetworkCallback(networkCallBack);        }    }        @Override    protected void onResume() {        super.onResume();        //Log.e(TAG,  "=====在onResume方法中判断 : isMobileNetwork :" + NetworkUtils.isMobileNetwork(this));        //Log.e(TAG,  "=====在onResume方法中判断 : isWifiNetwork :" + NetworkUtils.isWifiNetwork(this));        //Log.e(TAG,  "=====在onResume方法中判断 : getConnectedNetworkType :" + NetworkUtils.getConnectedNetworkType(this));    }    @Override    protected void onDestroy() {        super.onDestroy();        if (networkService != null && networkCallBack != null) {            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);            if (NetworkUtils.isConnectedAvailableNetwork(getBaseContext())) {                Log.d(TAG, "onCapabilitiesChanged ---> ====网络可正常上网===网络类型为: "+ NetworkUtils.getConnectedNetworkType(MainActivity.this));            }            //表明此网络连接验证成功            if(networkCapabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED)) {                if (networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)) {                    Log.d(TAG, "===当前在使用Mobile流量上网===");                } else if (networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)) {                    Log.d(TAG, "====当前在使用WiFi上网===");                } else if (networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_BLUETOOTH)) {                    Log.d(TAG, "=====当前使用蓝牙上网=====");                } else if (networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_ETHERNET)) {                    Log.d(TAG, "=====当前使用以太网上网=====");                } else if (networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_VPN)) {                    Log.d(TAG, "===当前使用VPN上网====");                } else if (networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI_AWARE)) {                    Log.d(TAG, "===表示此网络使用Wi-Fi感知传输====");                } else if (networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_LOWPAN)) {                    Log.d(TAG, "=====表示此网络使用LoWPAN传输=====");                } else if (networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_USB)) {                    Log.d(TAG, "=====表示此网络使用USB传输=====");                }            }        }        @Override        public void onAvailable(@NonNull Network network) {            super.onAvailable(network);            Log.e(TAG, "==网络连接成功,通知可以使用的时候调用====onAvailable===");        }        @Override        public void onUnavailable() {            Log.e(TAG, "==当网络连接超时或网络请求达不到可用要求时调用====onUnavailable===");            super.onUnavailable();        }        @Override        public void onBlockedStatusChanged(@NonNull Network network, boolean blocked) {            Log.e(TAG, "==当访问指定的网络被阻止或解除阻塞时调用===onBlockedStatusChanged==");            super.onBlockedStatusChanged(network, blocked);        }        @Override        public void onLosing(@NonNull Network network, int maxMsToLive) {            Log.e(TAG, "==当网络正在断开连接时调用===onLosing===");            super.onLosing(network, maxMsToLive);        }        @Override        public void onLost(@NonNull Network network) {            Log.e(TAG, "==当网络已断开连接时调用===onLost===");            super.onLost(network);        }        @Override        public void onLinkPropertiesChanged(@NonNull Network network, @NonNull LinkProperties linkProperties) {            Log.e(TAG, "==当网络连接的属性被修改时调用===onLinkPropertiesChanged===");            super.onLinkPropertiesChanged(network, linkProperties);        }    };}

网络工具类NetworkUtils.java

@SuppressLint("NewApi")public class NetworkUtils {    private static final String TAG = "ConnectManager";        public static final int TRANSPORT_CELLULAR = 0;        public static final int TRANSPORT_WIFI = 1;        public static final int TRANSPORT_BLUETOOTH = 2;        public static final int TRANSPORT_ETHERNET = 3;        public static final int TRANSPORT_VPN = 4;        public static final int TRANSPORT_WIFI_AWARE = 5;        public static final int TRANSPORT_LOWPAN = 6;        public static final int TRANSPORT_TEST = 7;        public static final int TRANSPORT_USB = 8;        public static boolean isMobileNetwork(Context context) {        ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);        Network network = cm.getActiveNetwork();        if (null == network) {            return false;        }        NetworkCapabilities capabilities = cm.getNetworkCapabilities(network);        if (null == capabilities) {            return false;        }        return capabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)                && capabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED);    }        public static boolean isWifiNetwork(Context context) {        ConnectivityManager cm = (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);        Network network = cm.getActiveNetwork();        if (null == network) {            return false;        }        NetworkCapabilities capabilities = cm.getNetworkCapabilities(network);        if (null == capabilities) {            return false;        }        return capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)                && capabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED);    }        public static boolean isEthernetNetwork(Context context) {        ConnectivityManager cm = (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);        Network network = cm.getActiveNetwork();        if (null == network) {            return false;        }        NetworkCapabilities capabilities = cm.getNetworkCapabilities(network);        if (null == capabilities) {            return false;        }        return capabilities.hasTransport(NetworkCapabilities.TRANSPORT_ETHERNET)                && capabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED);    }        public static boolean isConnectedAvailableNetwork(Context context) {        ConnectivityManager cm = (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);        Network network = cm.getActiveNetwork();        if (null == network) {            return false;        }        NetworkCapabilities capabilities = cm.getNetworkCapabilities(network);        if (null == capabilities) {            return false;        }        return capabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)                && capabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED);    }        public static int getConnectedNetworkType(Context context) {        ConnectivityManager cm = (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);        Network network = cm.getActiveNetwork();        if (null == network) {            return -1;        }        NetworkCapabilities capabilities = cm.getNetworkCapabilities(network);        if (null == capabilities) {            return -1;        }        if (capabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED)) {            if (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)) {                return NetworkCapabilities.TRANSPORT_CELLULAR;            } else if (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)) {                return NetworkCapabilities.TRANSPORT_WIFI;            } else if (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_BLUETOOTH)) {                return NetworkCapabilities.TRANSPORT_BLUETOOTH;            } else if (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_ETHERNET)) {                return NetworkCapabilities.TRANSPORT_ETHERNET;            } else if (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_VPN)) {                return NetworkCapabilities.TRANSPORT_VPN;            } else if (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI_AWARE)) {                return NetworkCapabilities.TRANSPORT_WIFI_AWARE;            } else if (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_LOWPAN)) {                return NetworkCapabilities.TRANSPORT_LOWPAN;            } else if (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_USB)) {                return NetworkCapabilities.TRANSPORT_USB;            }        }        return -1;    }}

Android10之后,请使用新的API方法, 工具类可以根据业务需求去扩展, 供参考。

来源地址:https://blog.csdn.net/u012514113/article/details/132091769

--结束END--

本文标题: Android 获取网络连接状态新方法

本文链接: http://www.lsjlt.com/news/401623.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Android 获取网络连接状态新方法
    一. 问题背景         Android12上,有的app模块判断当前网络的类型和连接状态时,还是使用的旧的API,导致返回的结果不准确,影响代码逻辑判断,本篇文章就这一问题,整理一下判断网络类型和连接状态的新方法。 二. 原因分...
    99+
    2023-09-09
    Android获取网络状态 Android获取连接网络类型
  • android获取及监听手机网络状态
    目录一、获取当前手机联网方式是WiFi还是手机4G数据二、监听手机网络变化总结一、获取当前手机联网方式是WiFi还是手机4G数据 private boolean getNetwork...
    99+
    2024-04-02
  • Android编程监听网络连接状态改变的方法
    本文实例讲述了Android编程监听网络连接状态改变的方法。分享给大家供大家参考,具体如下:BroadcastReceiverpublic class MyReceiver extends BroadcastReceiver { @Ove...
    99+
    2023-05-31
    android 监听 网络连接
  • android获取及监听手机网络状态的方法是什么
    这篇“android获取及监听手机网络状态的方法是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“android获取及监听...
    99+
    2023-06-26
  • linux网络连接状态怎么检查
    要检查Linux系统中的网络连接状态,可以使用以下命令: ifconfig:显示当前网络接口的配置和状态,包括IP地址、网络掩码、...
    99+
    2024-02-29
    linux
  • Android的WIFI和以太网连接状态
    在一些 Android 设备上同时具有以太网和Wifi网络连接 我们可以使用 ConnectivityManager 类来判断设备的网络状态。以下是一个 Kotlin 示例,说明了如何检查网络连接状态...
    99+
    2023-10-08
    android php 开发语言
  • Android应用中怎么对网络连接状态进行监听
    这篇文章给大家介绍Android应用中怎么对网络连接状态进行监听,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。思路:网络变化时系统会发出广播。所以我们监听这个广播,利用接口回调通知activity做相应的操作就好了。。...
    99+
    2023-05-31
    android roi
  • 从网络 TCP 连接获取 IPv4 地址
    “纵有疾风来,人生不言弃”,这句话送给正在学习Golang的朋友们,也希望在阅读本文《从网络 TCP 连接获取 IPv4 地址》后,能够真的帮助到大家。我也会在后续的文章中,陆续更新Golang相关...
    99+
    2024-04-04
  • Android中检查网络连接状态的变化无网络时跳转到设置界面
     在AndroidManifest.xml中加一个权限<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /><inte...
    99+
    2023-05-31
    android 网络连接 roi
  • Android获取移动网络信号强度的方法
    目录判断有没有 SIM 卡获取信号强度判断有没有 SIM 卡 获取移动网络的信号,一定要判断是否插了 SIM 卡,没插卡肯定是没法获取的 public sta...
    99+
    2024-04-02
  • Python--状态码的简介与获取方法
    一、网页HTTP状态码       HTTP状态码表示HTTP协议所返回的响应状态。       HTTP状态码有5种,所有状态码的第一个数字代表了响应的5种状态之一:(1)消息:1XX;(2)成功:2XX;(3)重定向:3XX;(4)请...
    99+
    2023-01-31
    状态 简介 方法
  • Android Studio获取网络JSON数据并处理的方法
    本文实例为大家分享了Android九宫格图片展示的具体代码,供大家参考,具体内容如下需要的网络JSON数据 数据实现类package chenglong.activitytest.pengintohospital.entity;import...
    99+
    2023-05-30
    android studio json
  • python获取网络数据的方法
    本篇内容主要讲解“python获取网络数据的方法”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“python获取网络数据的方法”吧!Retrieving Data over HTTPPython ...
    99+
    2023-06-14
  • linux如何显示所有网络设备的连接状态
    ...
    99+
    2024-04-02
  • 计算机网络中获取静态ip的方法有哪些
    这篇文章将为大家详细讲解有关计算机网络中获取静态ip的方法有哪些,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。1、移动终端最简单的获得静态IP地址的方法是通过IP代理,例如品易云代理,拥有世界性的地区资源...
    99+
    2023-06-15
  • win10更新19018新版本后无法连接网络的解决方法
    这篇文章将为大家详细讲解有关win10更新19018新版本后无法连接网络的解决方法,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。win10更新19018新版本后无法连接网络怎么办按下键盘上的【win】+【...
    99+
    2023-06-10
  • 怎么用css实现监控网络连接状态的页面
    这篇文章主要介绍怎么用css实现监控网络连接状态的页面,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!   代码解读   navigator.onLine属性用于获取在线状态,再配...
    99+
    2024-04-02
  • Win10Xbox无法连接网络该怎么办?Xbox无法连接网络解决方案
    许多客户使用Xbox,作为win10系统内置的平台游戏和应用,广泛用于视频录制和游戏下载。可是有Win10客户体现自身在应用全过程中碰到无法连接网络的状况,这应该怎么办?下边大家就一起来看看Xbox无法连接网络的解决方案。Xbox无法连接网...
    99+
    2023-07-10
  • Linux查看网络状态具体方法是什么
    这篇文章跟大家分析一下“Linux查看网络状态具体方法是什么”。内容详细易懂,对“Linux查看网络状态具体方法是什么”感兴趣的朋友可以跟着小编的思路慢慢深入来阅读一下,希望阅读后能够对大家有所帮助。下面跟着小编一起深入学习“Linux查看...
    99+
    2023-06-28
  • WinXP连接网络打印机方法
    1、​打开网上邻居,点击设置家庭或小型办公室网络。 2、点击下一步 3、下一步选择“此计算机通过居民的网关或网络上的其他计算机连接到internet” 4、下一步“...
    99+
    2023-06-01
    网络打印机连接方法 如何连接网络打印机 网络打印机无法连接 网络 打印机 方法
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作