实现设备网络监听鸿蒙示例代码 原创

鸿蒙场景化示例代码技术工程师
发布于 2025-2-12 17:02
浏览
0收藏

本文原创发布在华为开发者社区

介绍

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

  1. 利用 NetConnection 监听当前网络连接状态。
  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) : '未知'
  }
}
  • 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.

监听网络类型(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
        }
      });
    });
  }
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.

©著作权归作者所有,如需转载,请注明出处,否则将追究法律责任
分类
已于2025-2-28 14:48:09修改
收藏
回复
举报


回复
    相关推荐