当前位置: 首页 > 科技观察

Harmonyos系统获取当前网络状态,监控网络状态

时间:2023-03-18 01:44:36 科技观察

更多内容请访问:https://harmonyos.51cto.com,与华为官方共同打造的鸿蒙技术社区1.前言在应用开发过程中,总是需要获取网络状态,当前是否有网络,是使用数据网络还是无线网络。鸿蒙提供了一系列获取网络状态的方法。2.添加权限ohos.permission.GET_NETWORK_INFO该权限用于获取网络信息。ohos.permission.INTERNET此权限用于访问Internet1.2。这两个权限不需要动态申请,只需要在配置文件中声明即可。如何添加权限见下图。如果不能如下图操作,请将编译器升级到最新版本。3.获取网络状态3.1获取当前网络状态以下类可以获取当前网络状态,判断是否可以上网。有时候我们连上了网络,但是因为网络过期(付费时间)或者代理不可用,导致设备连上了网络,但是无法上网。publicclassNetworkUtil{/***网络是否连接**@paramcontextcontext*@returntrue表示网络已连接,可以上网。false表示未连接网络,或已连接网络,但无法上网*/publicstaticbooleanisNetworkConnectedInternet(Contextcontext){NetManagernetManager=NetManager.getInstance(context);NetCapabilitiesnetCapabilities=netManager.getNetCapabilities(netManager.getDefaultNet());//NetCapabilities.NET_CAPABILITY_VALIDATED表示连接已联网,可以上网连接网络。false表示未连接WiFi,或连接了WiFi,但无法上网*/publicstaticbooleanisWifiConnectedInternet(Contextcontext){//获取网络管理对象NetManagernetManager=NetManager.getInstance(context);//获取NetCapabilities对象NetCapabilitiesnetCapabilities=netManager.getNetCapabilities(netManager.getDefaultNet());//NetCapabilities.NET_CAPABILITY_VALIDATED表示已连接网络并可以上网.ABEARER_WIFI)是否是数据网络连接**@paramcontextcontext*@returntrue表示是数据网络连接,可以上网。false表示没有连接数据网络,或者连接了数据网络,但是不能上网*/publicstaticbooleanisMobileConnectedInternet(Contextcontext){NetManagernetManager=NetManager.getInstance(context);NetCapabilitiesnetCapabilities=netManager.getNetCapabilities(netManager.getDefaultNet());//NetCapabilities.NET_CAPABILITY_VALIDATED表示网络已连接,可以上网returnnetCapabilities.hasCap(NetCapabilities.NET_CAPABILITY_VALIDATED)&&netCapabilities.hasBearer(NetCapabilities.BEARER_CELLULAR);}/***这个方法也可以判断网络是否已连接**@paramcontextcontext*@return只要网络已经连接上了就返回true,不管能不能上网。有时候我们连上了网络,但是因为网络过期了(该交钱了)或者使用的代理不可用,设备虽然连上了网络,但是无法上网*/publicstaticbooleanisNetworkConnected(Contextcontext){NetManagernetManager=NetManager.getInstance(context);NetHandle[]allNets=netManager.getAllNets();returnallNets!=null&&allNets.length>0;}/***是否是WiFi连接**@paramcontextContext*@return只要是WiFi连接,返回true,是否可以上网。有时候我们连上了网络,但是因为网络过期了(该交钱了)或者使用的代理不可用,设备虽然连上了网络,但是无法上网*/publicstaticbooleanisWifiConnected(Contextcontext){//获取网络管理对象NetManagernetManager=NetManager.getInstance(context);//获取NetCapabilities对象NetCapabilitiesnetCapabilities=netManager.getNetCapabilities(netManager.getDefaultNet());returnnetCapabilities.hasBearer(NetCapabilities.BEARER_WIFI)||netCapabilities.hasBearer(NetCapabilities.BEARER_WIFI}_A是数据网络连接**@paramcontextcontext*@return只要是数据网络连接就返回true,不管能不能上网,有时候我们连上了网络,但是因为网络过期了(该交钱了),设备虽然连上了网络,但是不能上网*/publicstaticbooleanisMobileConnected(Contextcontext){NetManagernetManager=NetManager.getInstance(context);NetCapabilitiesnetCapabilities=netManager.getNetCapabilities(netManager.getDefaultNet());returnnetCapabilities.hasBearer(NetCapabilities.BEARER_CELLULAR);}}3、2获取实时网络状态,监控网络状态以上方法只能获取当前网络状态,不能获取实时网络状态,用户可以随时打开或关闭网络,当用户打开或关闭网络时,我们希望得到实时网络状态。要获得实时的网络状态,就需要对网络进行监控。NetStatusCallback用于监听网络状态,可以继承这个类来监听网络状态。它有以下方法:最常用的方法是onAvailable、onLost和onCapabilitiesChanged方法。自定义一个类,继承NetStatusCallback。/***@author裴云飞*@date2021/4/11*/publicclassDefaultNetStatusCallbackextendsNetStatusCallback{@OverridepublicvoidonAvailable(NetHandlehandle){super.onAvailable(handle);LogUtils.d("yunfei","网络连接成功");}@OverridepublicvoidonBlocked(StatusChangNetHandlehandle,booleanblocked){super.onBlockedStatusChanged(handle,blocked);LogUtils.d("yunfei","接入网阻塞状态发生变化");}@OverridepublicvoidonLosing(NetHandlehandle,longmaxMsToLive){super.onLosing(handle,maxMsToLive);LogUtils.d("yunfei","网络断开连接");}@OverridepublicvoidonLost(NetHandlehandle){super.onLost(handle);LogUtils.d("yunfei","网络断开");}@OverridepublicvoidonUnavailable(){super.onUnavailable();LogUtils.d("yunfei","网络连接超时或网络不可达");}@OverridepublicvoidonCapabilitiesChanged(NetHandlehandle,NetCapabilitiesnetworkCapabilities){super.onCapabilitiesChanged(handle,networkCapabilities.dworkCapabilities);LogUtils("云飞","网络状态改变但仍然可用");}@OverridepublicvoidonConnectionPropertiesChanged(NetHandlehandle,ConnectionPropertiesconnectionProperties){super.onConnectionPropertiesChanged(handle,connectionProperties);LogUtils.d("yunfei","网络连接的属性已修改");}}onCapabilitiesChanged(NetHandlehandle,NetCapabilitiesnetworkCapabilities)是比较常用的网络状态变化时的监听,参数networkCapabilities有两个常用的方法hasCap判断网络是否连通。参数有多个(具体参数见NetCapabilities)。常用参数如下:hasBearer可以判断网络类型。onCapabilitiesChanged(NetHandlehandle,NetCapabilitiesnetworkCapabilities)的具体使用如下:@OverridepublicvoidonCapabilitiesChanged(NetHandlehandle,NetCapabilitiesnetworkCapabilities){super.onCapabilitiesChanged(handle,networkCapabilities);LogUtils.d("yunfei","istheoldnetworkstatuschange"但是still)if(networkCapabilities.hasCap(NetCapabilities.NET_CAPABILITY_VALIDATED)){//网络连接成功,可以上网了.d("yunfei","使用WiFi");}elseif(networkCapabilities.hasBearer(NetCapabilities.BEARER_CELLULAR)||networkCapabilities.hasBearer(NetCapabilities.BEARER_ETHERNET)){LogUtils.d("yunfei","使用数据网络");}else{//其他网络,包括蓝牙、VPN、LoWPAN等LogUtils.d("yunfei","othernetworks");}}}定义监听网络类后,即可使用。获取当前网络状态,直接调用NetworkUtil类中的方法即可。如果要获取实时网络状态,需要添加监控,先获取网管对象,再添加监控,这样就可以实时监控网络的状态。最后,不要忘记在onStop方法中移除侦听器。publicclassMainAbilitySliceextendsAbilitySlice{privateNetManagernetManager;privateDefaultNetStatusCallbackmDefaultNetStatusCallback=newDefaultNetStatusCallback();@OverridepublicvoidonStart(Intentintent){super.onStart(intent);super.setUIContent(ResourceTable.Layout_ability可以连接到互联网,但不是真正的**网络连接_main)*有时我们连接到有网络,但是因为网络过期(该交费了)或者使用的代理不可用,*设备虽然连上了网络,但是无法上网*/booleannetworkConnect=NetworkUtil.isNetworkConnected(this);//不管是wifi连接,只要是wifi连接,都会返回true,不管是否能上网。booleanwifiConnected=NetworkUtil.isWifiConnected(this);//如果是数据网络连接,只要是数据网络连接就返回true,不管是否可以上网booleanmobileConnected=NetworkUtil.isMobileConnected(this);//是否联网,true表示已经联网Connected,可以上网booleannetworkConnectedInternet=NetworkUtil.isNetworkConnectedInternet(this);//是否是wifi连接,true表示wifi连接,可以上网上网booleanwifiConnectedInternet=NetworkUtil.isWifiConnectedInternet(this);//是否是数据网络连接,true表示数据网络已连接,并且可以上网booleanmobileConnectedInternet=NetworkUtil.isMobileConnectedInternet(this);/**下面的代码是用于获取实时网络状态。用户可以随时打开或关闭网络,当用户打开或关闭网络时,*我们可以获得实时网络状态*///获取网络管理对象netManager=NetManager.getInstance(this);//添加监控,监控实时网络状态netManager.addDefaultNetStatusCallback(mDefaultNetStatusCallback);}@OverridepublicvoidonActive(){super.onActive();}@OverridepublicvoidonForeground(Intentintent){super.onForeground(intent);}@OverrideprotectedvoidonStop(){super.onStop();if(netManager!=null){//移除监听netManager.removeNetStatusCallback(mDefaultNetStatusCallback);}}}4.总结本文主要讲解获取当前网络状态和监听网络状态,注意的是支付当前网络状态和实时网络状态之间的差异。最后附上源码。代码运行后,可以随时开启或关闭网络,获取实时网络状态。博客地址更多内容请访问:与华为官网共建鸿蒙科技社区https://harmonyos.51cto.com