鸿蒙系统获取当前的网络状态以及监听网络状态

系统
文章由鸿蒙社区产出,想要了解更多内容请前往:51CTO和华为官方战略合作共建的鸿蒙技术社区https://harmonyos.51cto.com

[[393146]]

想了解更多内容,请访问:

51CTO和华为官方合作共建的鸿蒙技术社区

https://harmonyos.51cto.com

一、前言

在应用开发过程中,总是需要获取网络状态,当前是否有网络,当前是使用数据网络还是使用无线网络。鸿蒙提供了一系列方法来获取网络状态。

二、添加权限

ohos.permission.GET_NETWORK_INFO 这个权限用于获取网络信息。

ohos.permission.INTERNET 这个权限用于访问网络1.2。

这两个权限不需要动态申请,只需要在配置文件中声明即可。

添加权限的方式查看下图,如果你没办法像下图一样的操作,请把编译器升级到最新版。

三、获取网络状态

3、1 获取当前的网络状态

下面的类可以获取当前的网络状态,并且可以判断能否上网。有时我们连接了一个网络,但由于网络已经到期(该交钱了)或者代理不可用,设备虽然连接了网络,但是不能上网。

  1. public class NetworkUtil { 
  2.  
  3.     /** 
  4.      * 网络是否连接 
  5.      * 
  6.      * @param context 上下文 
  7.      * @return true表示网络已经连接,并且可以上网。false表示网络没连接,或者网络连接了,但是不能上网 
  8.      */ 
  9.     public static boolean isNetworkConnectedInternet(Context context) { 
  10.         NetManager netManager = NetManager.getInstance(context); 
  11.         NetCapabilities netCapabilities = netManager.getNetCapabilities(netManager.getDefaultNet()); 
  12.         // NetCapabilities.NET_CAPABILITY_VALIDATED表示连接了网络,并且可以上网 
  13.         return netCapabilities.hasCap(NetCapabilities.NET_CAPABILITY_VALIDATED); 
  14.     } 
  15.  
  16.     /** 
  17.      * 是否是WiFi连接 
  18.      * 
  19.      * @param context 上下文 
  20.      * @return true表示WiFi连接,并且可以上网。false表示WiFi没连接,或者WiFi连接了,但是不能上网 
  21.      */ 
  22.     public static boolean isWifiConnectedInternet(Context context) { 
  23.         // 获取网络管理对象 
  24.         NetManager netManager = NetManager.getInstance(context); 
  25.         // 获取NetCapabilities对象 
  26.         NetCapabilities netCapabilities = netManager.getNetCapabilities(netManager.getDefaultNet()); 
  27.         // NetCapabilities.NET_CAPABILITY_VALIDATED表示连接了网络,并且可以上网 
  28.         return netCapabilities.hasCap(NetCapabilities.NET_CAPABILITY_VALIDATED) && 
  29.                 netCapabilities.hasBearer(NetCapabilities.BEARER_WIFI) || 
  30.                 netCapabilities.hasBearer(NetCapabilities.BEARER_WIFI_AWARE); 
  31.     } 
  32.  
  33.     /** 
  34.      * 是否是数据网络连接 
  35.      * 
  36.      * @param context 上下文 
  37.      * @return true表示数据网络连接,并且可以上网。false表示数据网络没连接,或者数据网络连接了,但是不能上网 
  38.      */ 
  39.     public static boolean isMobileConnectedInternet(Context context) { 
  40.         NetManager netManager = NetManager.getInstance(context); 
  41.         NetCapabilities netCapabilities = netManager.getNetCapabilities(netManager.getDefaultNet()); 
  42.         // NetCapabilities.NET_CAPABILITY_VALIDATED表示连接了网络,并且可以上网 
  43.         return netCapabilities.hasCap(NetCapabilities.NET_CAPABILITY_VALIDATED) && 
  44.                 netCapabilities.hasBearer(NetCapabilities.BEARER_CELLULAR); 
  45.     } 
  46.  
  47.     /** 
  48.      * 这种方式也可以判断网络是否连接 
  49.      * 
  50.      * @param context 上下文 
  51.      * @return 只要网络已经连接,就返回true,不管能不能上网。有时我们连接了一个网络,但由于网络已经到期(该交钱了)或者使用的代理不可用,设备虽然连接了网络,但是不能上网 
  52.      */ 
  53.     public static boolean isNetworkConnected(Context context) { 
  54.         NetManager netManager = NetManager.getInstance(context); 
  55.         NetHandle[] allNets = netManager.getAllNets(); 
  56.         return allNets != null && allNets.length > 0; 
  57.     } 
  58.  
  59.     /** 
  60.      * 是否是WiFi连接 
  61.      * 
  62.      * @param context 上下文 
  63.      * @return 只要是WiFi连接,就返回true,不管能不能上网。有时我们连接了一个网络,但由于网络已经到期(该交钱了)或者使用的代理不可用,设备虽然连接了网络,但是不能上网 
  64.      */ 
  65.     public static boolean isWifiConnected(Context context) { 
  66.         // 获取网络管理对象 
  67.         NetManager netManager = NetManager.getInstance(context); 
  68.         // 获取NetCapabilities对象 
  69.         NetCapabilities netCapabilities = netManager.getNetCapabilities(netManager.getDefaultNet()); 
  70.         return netCapabilities.hasBearer(NetCapabilities.BEARER_WIFI) || 
  71.                 netCapabilities.hasBearer(NetCapabilities.BEARER_WIFI_AWARE); 
  72.     } 
  73.  
  74.     /** 
  75.      * 是否是数据网络连接 
  76.      * 
  77.      * @param context 上下文 
  78.      * @return 只要是数据网络连接,就返回true,不管能不能上网。有时我们连接了一个网络,但由于网络已经到期(该交钱了),设备虽然连接了网络,但是不能上网 
  79.      */ 
  80.     public static boolean isMobileConnected(Context context) { 
  81.         NetManager netManager = NetManager.getInstance(context); 
  82.         NetCapabilities netCapabilities = netManager.getNetCapabilities(netManager.getDefaultNet()); 
  83.         return netCapabilities.hasBearer(NetCapabilities.BEARER_CELLULAR); 
  84.     } 

3、2 获取实时的网络状态,监听网络状态

上面的方式只能获取到当前的网络状态,并不能获取到实时的网络状态。用户可以随时打开或者关闭网络,当用户打开或者关闭网络的时候,我们希望可以实时的获取到网络状态。要想获取到实时的网络状态,就需要对网络进行监听。

NetStatusCallback用于监听网络的状态,可以继承该类来监听网络的状态。它有以下几个方法:

其中最为常用的方法为onAvailable,onLost,onCapabilitiesChanged方法。

自定义一个类,继承NetStatusCallback。

  1. /** 
  2.  * @author 裴云飞 
  3.  * @date 2021/4/11 
  4.  */ 
  5. public class DefaultNetStatusCallback extends NetStatusCallback { 
  6.  
  7.     @Override 
  8.     public void onAvailable(NetHandle handle) { 
  9.         super.onAvailable(handle); 
  10.         LogUtils.d("yunfei""网络连接成功"); 
  11.     } 
  12.  
  13.     @Override 
  14.     public void onBlockedStatusChanged(NetHandle handle, boolean blocked) { 
  15.         super.onBlockedStatusChanged(handle, blocked); 
  16.         LogUtils.d("yunfei""访问的网络阻塞状态发生变化"); 
  17.     } 
  18.  
  19.     @Override 
  20.     public void onLosing(NetHandle handle, long maxMsToLive) { 
  21.         super.onLosing(handle, maxMsToLive); 
  22.         LogUtils.d("yunfei""网络正在丢失连接"); 
  23.     } 
  24.  
  25.     @Override 
  26.     public void onLost(NetHandle handle) { 
  27.         super.onLost(handle); 
  28.         LogUtils.d("yunfei""网络已断开连接"); 
  29.     } 
  30.  
  31.     @Override 
  32.     public void onUnavailable() { 
  33.         super.onUnavailable(); 
  34.         LogUtils.d("yunfei""网络连接超时或网络不可达"); 
  35.     } 
  36.  
  37.     @Override 
  38.     public void onCapabilitiesChanged(NetHandle handle, NetCapabilities networkCapabilities) { 
  39.         super.onCapabilitiesChanged(handle, networkCapabilities); 
  40.         LogUtils.d("yunfei""网络状态变化但仍旧是可用状态"); 
  41.     } 
  42.  
  43.     @Override 
  44.     public void onConnectionPropertiesChanged(NetHandle handle, ConnectionProperties connectionProperties) { 
  45.         super.onConnectionPropertiesChanged(handle, connectionProperties); 
  46.         LogUtils.d("yunfei""网络连接的属性被修改"); 
  47.     } 

onCapabilitiesChanged(NetHandle handle, NetCapabilities networkCapabilities)是较为常用的网络状态发生变化时的监听,其中的参数networkCapabilities有两个常用的方法。

hasCap判断网络是否连接,有多个参数(具体的参数可查看NetCapabilities),其中常用参数如下:

hasBearer可以判断网络的类型,同样有多个参数(具体的参数可查看NetCapabilities),其中常用参数如下:

onCapabilitiesChanged(NetHandle handle, NetCapabilities networkCapabilities)的具体使用如下:

  1. @Override 
  2.    public void onCapabilitiesChanged(NetHandle handle, NetCapabilities networkCapabilities) { 
  3.        super.onCapabilitiesChanged(handle, networkCapabilities); 
  4.        LogUtils.d("yunfei""网络状态变化但仍旧是可用状态"); 
  5.        if (networkCapabilities.hasCap(NetCapabilities.NET_CAPABILITY_VALIDATED)) { 
  6.            // 网络连接成功,并且可以上网 
  7.            if (networkCapabilities.hasBearer(NetCapabilities.BEARER_WIFI)|| 
  8.                    networkCapabilities.hasBearer(NetCapabilities.BEARER_WIFI_AWARE)) { 
  9.                LogUtils.d("yunfei""使用WiFi"); 
  10.            } else if (networkCapabilities.hasBearer(NetCapabilities.BEARER_CELLULAR) || 
  11.                    networkCapabilities.hasBearer(NetCapabilities.BEARER_ETHERNET)) { 
  12.                LogUtils.d("yunfei""使用数据网络"); 
  13.            } else { 
  14.                // 其它网络,包括蓝牙、VPN、LoWPAN等 
  15.                LogUtils.d("yunfei""其它网络"); 
  16.            } 
  17.        } 
  18.    } 

定义好监听网络的类后,就可以使用了。要想获取当前的网络状态,直接调用NetworkUtil类中的方法即可。要想获取实时的网络状态,就需要添加监听,首先获取网络管理对象,然后添加监听,这样就能实时的监听到网络的状态了。最后别忘了在onStop方法里面移除监听。

  1. public class MainAbilitySlice extends AbilitySlice { 
  2.  
  3.     private NetManager netManager; 
  4.     private DefaultNetStatusCallback mDefaultNetStatusCallback = new DefaultNetStatusCallback(); 
  5.     @Override 
  6.     public void onStart(Intent intent) { 
  7.         super.onStart(intent); 
  8.         super.setUIContent(ResourceTable.Layout_ability_main); 
  9.         /* 
  10.          * 网络是否连接,true表示网络已经连接,但未必可以上网, 
  11.          * 有时我们连接了一个网络,但由于网络已经到期(该交钱了)或者使用的代理不可用, 
  12.          * 设备虽然连接了网络,但是不能上网 
  13.          */ 
  14.         boolean networkConnect = NetworkUtil.isNetworkConnected(this); 
  15.         // 是否是WiFi连接,只要是WiFi连接,就返回true,不管能不能上网。 
  16.         boolean wifiConnected = NetworkUtil.isWifiConnected(this); 
  17.         // 否是数据网络连接,只要是数据网络连接,就返回true,不管能不能上网 
  18.         boolean mobileConnected = NetworkUtil.isMobileConnected(this); 
  19.  
  20.         // 网络是否连接,true表示网络已经连接,并且可以上网 
  21.         boolean networkConnectedInternet = NetworkUtil.isNetworkConnectedInternet(this); 
  22.         // 是否是WiFi连接,true表示WiFi连接,并且可以上网 
  23.         boolean wifiConnectedInternet = NetworkUtil.isWifiConnectedInternet(this); 
  24.         // 是否是数据网络连接,true表示数据网络连接,并且可以上网 
  25.         boolean mobileConnectedInternet = NetworkUtil.isMobileConnectedInternet(this); 
  26.  
  27.         /* 
  28.          * 下面的代码用于获取实时的网络状态。用户可以随时打开或者关闭网络,当用户打开或者关闭网络时, 
  29.          * 我们可以获取实时的网络状态 
  30.          */ 
  31.         // 获取网络管理对象 
  32.         netManager = NetManager.getInstance(this); 
  33.         // 添加监听,监听实时的网络状态 
  34.         netManager.addDefaultNetStatusCallback(mDefaultNetStatusCallback); 
  35.     } 
  36.  
  37.     @Override 
  38.     public void onActive() { 
  39.         super.onActive(); 
  40.     } 
  41.  
  42.     @Override 
  43.     public void onForeground(Intent intent) { 
  44.         super.onForeground(intent); 
  45.     } 
  46.  
  47.     @Override 
  48.     protected void onStop() { 
  49.         super.onStop(); 
  50.         if (netManager != null) { 
  51.             // 移除监听 
  52.            netManager.removeNetStatusCallback(mDefaultNetStatusCallback); 
  53.         } 
  54.     } 

四、总结

本文主要是对获取当前网络状态以及监听网络状态进行讲解,需要注意当前的网络状态和实时的网络状态的区别。

最后奉上源码代码运行起来后,大家可以随时打开或者关闭网络,以获取实时的网络状态

博客地址

想了解更多内容,请访问:

51CTO和华为官方合作共建的鸿蒙技术社区

https://harmonyos.51cto.com

 

责任编辑:jianghua 来源: 鸿蒙社区
相关推荐

2015-08-07 15:42:21

网络监听源码

2013-03-26 13:42:12

Android 监听网

2012-12-26 13:26:38

Android开发飞行模式

2010-12-23 14:42:54

网络连接

2010-05-14 10:37:20

2010-01-28 15:49:17

Android判断网络

2024-04-16 00:13:52

JS网络状态ts类

2009-01-18 09:15:00

网络管理远程监控

2013-05-13 08:59:54

网络管理网络组件AT

2023-11-27 13:57:00

Linux用法

2020-11-11 10:25:51

Linuxss命令

2014-08-22 09:10:46

2021-12-31 13:02:33

netstatLinuxss

2015-05-14 14:51:58

OpenStack N系统状态多租户

2021-05-10 14:47:07

网络安全美国勒索软件

2021-05-11 09:15:59

网络攻击恶意软件勒索软件

2021-05-11 09:00:59

美国燃油网络网络攻击

2014-06-24 15:56:15

WhatsUp Gol网络监控

2020-05-27 11:10:54

KerasLSTM神经网络

2009-01-18 09:18:00

网络状态网络信息
点赞
收藏

51CTO技术栈公众号