一、前言

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

二、添加权限

ohos.permission.GET_NETWORK_INFO 这个权限用于获取网络信息
ohos.permission.INTERNET 这个权限用于访问网络1.2.

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

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

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

 三、获取网络状态

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

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

public class NetworkUtil {

    /**
     * 网络是否连接
     *
     * @param context 上下文
     * @return true表示网络已经连接,并且可以上网。false表示网络没连接,或者网络连接了,但是不能上网
     */
    public static boolean isNetworkConnectedInternet(Context context) {
        NetManager netManager = NetManager.getInstance(context);
        NetCapabilities netCapabilities = netManager.getNetCapabilities(netManager.getDefaultNet());
        // NetCapabilities.NET_CAPABILITY_VALIDATED表示连接了网络,并且可以上网
        return netCapabilities.hasCap(NetCapabilities.NET_CAPABILITY_VALIDATED);
    }

    /**
     * 是否是WiFi连接
     *
     * @param context 上下文
     * @return true表示WiFi连接,并且可以上网。false表示WiFi没连接,或者WiFi连接了,但是不能上网
     */
    public static boolean isWifiConnectedInternet(Context context) {
        // 获取网络管理对象
        NetManager netManager = NetManager.getInstance(context);
        // 获取NetCapabilities对象
        NetCapabilities netCapabilities = netManager.getNetCapabilities(netManager.getDefaultNet());
        // NetCapabilities.NET_CAPABILITY_VALIDATED表示连接了网络,并且可以上网
        return netCapabilities.hasCap(NetCapabilities.NET_CAPABILITY_VALIDATED&&
                netCapabilities.hasBearer(NetCapabilities.BEARER_WIFI||
                netCapabilities.hasBearer(NetCapabilities.BEARER_WIFI_AWARE);
    }

    /**
     * 是否是数据网络连接
     *
     * @param context 上下文
     * @return true表示数据网络连接,并且可以上网。false表示数据网络没连接,或者数据网络连接了,但是不能上网
     */
    public static boolean isMobileConnectedInternet(Context context) {
        NetManager netManager = NetManager.getInstance(context);
        NetCapabilities netCapabilities = netManager.getNetCapabilities(netManager.getDefaultNet());
        // NetCapabilities.NET_CAPABILITY_VALIDATED表示连接了网络,并且可以上网
        return netCapabilities.hasCap(NetCapabilities.NET_CAPABILITY_VALIDATED&&
                netCapabilities.hasBearer(NetCapabilities.BEARER_CELLULAR);
    }

    /**
     * 这种方式也可以判断网络是否连接
     *
     * @param context 上下文
     * @return 只要网络已经连接,就返回true,不管能不能上网。有时我们连接了一个网络,但由于网络已经到期(该交钱了)或者使用的代理不可用,设备虽然连接了网络,但是不能上网
     */
    public static boolean isNetworkConnected(Context context) {
        NetManager netManager = NetManager.getInstance(context);
        NetHandle[] allNets = netManager.getAllNets();
        return allNets != null && allNets.length > 0;
    }

    /**
     * 是否是WiFi连接
     *
     * @param context 上下文
     * @return 只要是WiFi连接,就返回true,不管能不能上网。有时我们连接了一个网络,但由于网络已经到期(该交钱了)或者使用的代理不可用,设备虽然连接了网络,但是不能上网
     */
    public static boolean isWifiConnected(Context context) {
        // 获取网络管理对象
        NetManager netManager = NetManager.getInstance(context);
        // 获取NetCapabilities对象
        NetCapabilities netCapabilities = netManager.getNetCapabilities(netManager.getDefaultNet());
        return netCapabilities.hasBearer(NetCapabilities.BEARER_WIFI||
                netCapabilities.hasBearer(NetCapabilities.BEARER_WIFI_AWARE);
    }

    /**
     * 是否是数据网络连接
     *
     * @param context 上下文
     * @return 只要是数据网络连接,就返回true,不管能不能上网。有时我们连接了一个网络,但由于网络已经到期(该交钱了),设备虽然连接了网络,但是不能上网
     */
    public static boolean isMobileConnected(Context context) {
        NetManager netManager = NetManager.getInstance(context);
        NetCapabilities netCapabilities = netManager.getNetCapabilities(netManager.getDefaultNet());
        return netCapabilities.hasBearer(NetCapabilities.BEARER_CELLULAR);
    }}1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.30.31.32.33.34.35.36.37.38.39.40.41.42.43.44.45.46.47.48.49.50.51.52.53.54.55.56.57.58.59.60.61.62.63.64.65.66.67.68.69.70.71.72.73.74.75.76.77.78.79.80.81.82.83.84.85.

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

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

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

方法

含义

​onAvailable(NetHandle handle)​

网络连接成功

​onLosing(NetHandle handle, long maxMsToLive)​

网络正在丢失连接

​onLost(NetHandle handle)​

网络已断开连接 

​onBlockedStatusChanged(NetHandle handle, boolean blocked)​

访问的网络阻塞状态发生变化

​onUnavailable()​

网络连接超时或网络不可达 

​onCapabilitiesChanged(NetHandle handle, NetCapabilities networkCapabilities)​

网络状态变化但仍旧是可用状态

​onConnectionPropertiesChanged(NetHandle handle, ConnectionProperties connectionProperties)​

网络连接的属性被修改

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

自定义一个类,继承​NetStatusCallback​。

/**
 * @author 裴云飞
 * @date 2021/4/11
 */public class DefaultNetStatusCallback extends NetStatusCallback {

    @Override
    public void onAvailable(NetHandle handle) {
        super.onAvailable(handle);
        LogUtils.d("yunfei""网络连接成功");
    }

    @Override
    public void onBlockedStatusChanged(NetHandle handleboolean blocked) {
        super.onBlockedStatusChanged(handleblocked);
        LogUtils.d("yunfei""访问的网络阻塞状态发生变化");
    }

    @Override
    public void onLosing(NetHandle handlelong maxMsToLive) {
        super.onLosing(handlemaxMsToLive);
        LogUtils.d("yunfei""网络正在丢失连接");
    }

    @Override
    public void onLost(NetHandle handle) {
        super.onLost(handle);
        LogUtils.d("yunfei""网络已断开连接");
    }

    @Override
    public void onUnavailable() {
        super.onUnavailable();
        LogUtils.d("yunfei""网络连接超时或网络不可达");
    }

    @Override
    public void onCapabilitiesChanged(NetHandle handleNetCapabilities networkCapabilities) {
        super.onCapabilitiesChanged(handlenetworkCapabilities);
        LogUtils.d("yunfei""网络状态变化但仍旧是可用状态");
    }

    @Override
    public void onConnectionPropertiesChanged(NetHandle handleConnectionProperties connectionProperties) {
        super.onConnectionPropertiesChanged(handleconnectionProperties);
        LogUtils.d("yunfei""网络连接的属性被修改");
    }}1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.30.31.32.33.34.35.36.37.38.39.40.41.42.43.44.45.46.47.48.

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

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

参数

含义

​NetCapabilities.NET_CAPABILITY_INTERNET​

是否连接了网络,不关心是否可以上网,有时我们连接了一个网络,但由于网络已经到期(该交钱了)或者使用的代理不可用,设备虽然连接了网络,但是不能上网

​NetCapabilities.NET_CAPABILITY_VALIDATED​

网络可用并且可以上网

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

参数

含义

​NetCapabilities.BEARER_WIFI​

表示接入的是WIFI网络

​NetCapabilities.BEARER_WIFI_AWARE​

该网络支持WiFi

​NetCapabilities.BEARER_CELLULAR​

表示接入的是蜂窝网络

​NetCapabilities.BEARER_ETHERNET​

表示接入的是以太网


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



文章后续内容和相关附件可以点击下面的原文链接前往学习

原文链接:  ​​https://harmonyos.51cto.com/posts/3890#bkwz​


​想了解更多关于鸿蒙的内容,请访问:​

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

​https://harmonyos.51cto.com/#bkwz​