监听设备网络状态 HarmonyOS 鸿蒙Next场景化代码

发布于 1周前 作者 bupafengyu 来自 鸿蒙OS

监听设备网络状态 HarmonyOS 鸿蒙Next场景化代码
<markdown _ngcontent-yjo-c147="" class="markdownPreContainer">

监听设备网络状态

介绍

本示例实现以下三种功能。

  1. 监听当前网络连接状态。
  2. 监听网络类型(wifi、蜂窝网络)。
  3. 判断蜂窝网络类型(3G\4G\5G)和信号强度。

监听设备网络状态源码地址

使用说明

  1. 进入应用默认网络开关开,网络类型为“未知”。
  2. 插入SIM卡,断开wifi,关闭数据流量,网络开关关闭,网络类型显示为“网络未开启”。
  3. 连接wifi,关闭数据流量,网络开关打开,网络类型显示为“Wi-Fi网络”。
  4. 断开wifi,打开数据流量,网络开关打开,网络类型显示为“蜂窝网络”,显示SIM卡槽,蜂窝网络类型(3G\4G\5G)以及信号等级强度。

效果预览

实现思路

监听网络连接状态

利用NetConnection可获取当前设备的网络连接状态。使用register接口注册订阅事件,设备从无网络到有网络会触发netAvailable事件、netCapabilitiesChange事件和netConnectionPropertiesChange事件;设备从有网络到无网络状态会触发netLost事件;设备从WiFi到蜂窝会触发netLost事件(WiFi丢失)之后触发netAvailable事件(蜂窝可用)。核心代码如下,源码参考

Index.ets

深色代码主题
复制
onNetCapabilitiesChange() {
    // 先使用register接口注册订阅事件
    this.netCon.register((error: BusinessError) => {
      if (error) {
        console.log(this.tag, `register failed ` + JSON.stringify(error));
      } else {
        console.log(this.tag, `register success`);
      }
    });
    // 订阅网络可用事件。调用register后,才能接收到此事件通知
    this.netCon.on('netAvailable', (data: connection.NetHandle) => {
      console.log(this.tag, 'netAvailable' + JSON.stringify(data));
      this.netAvailable = true;
      connection.getNetCapabilities(data, (error: BusinessError, data: connection.NetCapabilities) => {
        if (error) {
          console.log(this.tag, 'getNetCapabilities ' + JSON.stringify(error));
        }
        console.log(this.tag, 'getNetCapabilities ' + JSON.stringify(data));
        // 解析网络类型
        if (data && data.bearerTypes) {
          this.netBearType = data.bearerTypes[0];
          if (data.bearerTypes[0] == 0) {
            this.getSignalInformation()
          }
        }
      })
    });
    // 订阅网络能力变化事件
    this.netCon.on('netCapabilitiesChange', (data: connection.NetCapabilityInfo) => {
      console.log(this.tag, 'netCapabilitiesChange' + JSON.stringify(data));
    });
    // 订阅网络可用事件
    this.netCon.on('netConnectionPropertiesChange', (data: connection.NetConnectionPropertyInfo) => {
      console.log(this.tag, 'netConnectionPropertiesChange' + JSON.stringify(data));
    });
    // 订阅网络丢失事件
    this.netCon.on('netLost', (data: connection.NetHandle) => {
      console.log(this.tag, 'netLost' + JSON.stringify(data));
      this.netAvailable = false;
    });
    // 订阅网络不可用事件。调用register后,才能接收到此事件通知
    this.netCon.on('netUnavailable', () => {
      console.log(this.tag, 'netUnavailable');
      this.netAvailable = false;
    });
  }
  netBearTypeNameMapping(netBearType: number) {
    if (!this.netAvailable) {
      this.netBearType = -1;
      return '网络未开启'
    }
    return this.netBearHashMap.get(netBearType) ? this.netBearHashMap.get(netBearType) : '未知'
  }
}

监听网络类型(wifi、蜂窝网络)

NetBearType接口可获取当前网络类型并用不同的值表示,蜂窝网络值为0,Wi-Fi网络值为1。将网络类型与对应的值存储在HashMap中,通过查询键值对的方式判断当前网络类型并显示。

判断蜂窝网络类型(3G\4G\5G)和信号强度

利用@ohos.telephony.radio接口获取当前SIM卡所在卡槽以及网络信号强度等级,通过NetworkType获取蜂窝网络类型并用不同的值表示。将蜂窝网络类型与对应的值表示。将蜂窝网络类型与对应的值存储在HashMap中,通过查询键值对的方式判断当前蜂窝网络类型并显示。核心代码如下,源码参考

Index.ets

深色代码主题
复制
getSignalInformation() {
    // 获取蜂窝网络的SIM卡槽
    radio.getPrimarySlotId((err: BusinessError, data: number) => {
      if (err) {
        console.error(this.tag, `getPrimarySlotId failed, callback: err->${JSON.stringify(err)}`);
        return;
      }
      console.log(this.tag, `getPrimarySlotId success, callback: data->${JSON.stringify(data)}`);
      this.slotId = data;
      radio.getSignalInformation(data, (err: BusinessError, data: Array<radio.SignalInformation>) => {
        if (err) {
          console.error(this.tag, `getSignalInformation failed, callback: err->${JSON.stringify(err)}`);
          return;
        }
        console.log(this.tag, `getSignalInformation success, callback: data->${JSON.stringify(data)}`);
        if (data) {
          this.signalTypeName = this.signalTypeHashMap.get(data[0].signalType.toString())
          this.signalLevelName = data[0].signalLevel
        }
      });
    });
  }

工程结构&模块类型

深色代码主题
复制
entry/src/main/ets/
|---entryability
|   |---EntryAbility.ets
|---pages
|   |---Index.ets              // 首页

参考资料

</markdown>

更多关于监听设备网络状态 HarmonyOS 鸿蒙Next场景化代码的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html

1 回复

更多关于监听设备网络状态 HarmonyOS 鸿蒙Next场景化代码的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS鸿蒙系统中,监听设备网络状态可以通过订阅系统提供的网络变化事件来实现。以下是一个基于ArkUI(eTS,即Enhanced TypeScript)的场景化代码示例,用于监听设备网络状态变化:

import network from '@ohos.network';

@Entry
@Component
struct NetworkStatusListener {
  @State networkStatus: string = "Unknown";

  onNetworkStatusChanged(event: any) {
    if (event.isConnected) {
      this.networkStatus = "Connected";
    } else {
      this.networkStatus = "Disconnected";
    }
  }

  aboutToAppear() {
    network.on('networkStatusChange', this.onNetworkStatusChanged.bind(this));
  }

  aboutToDisappear() {
    network.off('networkStatusChange', this.onNetworkStatusChanged.bind(this));
  }

  build() {
    Column() {
      Text("Network Status: " + this.networkStatus)
    }.padding(20)
  }
}

上述代码中,network.on方法用于订阅网络状态变化事件,aboutToAppear生命周期钩子中注册监听器,aboutToDisappear生命周期钩子中取消监听。当网络状态发生变化时,onNetworkStatusChanged方法会被调用,并更新networkStatus状态,从而在界面上显示最新的网络状态。

如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html

回到顶部