三亩地 三亩地SAN MU DI · CODE DIARY
ARTICLE DETAIL

日记详情

真实记录编程学习的某一天,欢迎挑你感兴趣的翻一翻。

第25章_HarmonyOs开发图解之 电话服务

第25章_HarmonyOs开发图解之 电话服务

第25章 HarmonyOs开发图解之 电话服务

HarmonyOS 学习系统 | 阶段四:专业精通期


学习目标

序号能力
1掌握 RadioInfoManager 获取信号信息和网络类型
2能够使用 RadioStateObserver 监听信号和网络状态变化
3理解蜂窝网络类型(GPRS/LTE/5G NR)的含义

核心图解

内容讲解

25.1 电话服务概述

HarmonyOS 的电话服务模块通过RadioInfoManager提供蜂窝网络的信息查询和状态监听能力。开发者可以获取当前信号强度、网络类型(2G/3G/4G/5G)、SIM 卡状态等信息。

生活化类比:RadioInfoManager 就像"信号侦探"

想象你是一个信号侦探,装备了一台信号检测仪(RadioInfoManager)。你可以随时检测当前的信号有多强(getSignalInfoList)、手机连的是哪种网络(NetworkType:5G/LTE/3G),以及网络服务状态(网络是否可用)。RadioStateObserver 则像你雇了一个助手,他会持续帮你盯着信号变化,一旦信号从 5G 掉到 4G,他会立刻通知你。

25.2 网络类型对照表

NetworkType 值网络类型说明
0UNKNOWN未知网络
1GPRS2.5G
2CDMA2G CDMA
3EVDO3G CDMA
4WCDMA3G WCDMA
5LTE4G
6NR5G(New Radio)

25.3 信号信息获取与状态监听

// 获取信号信息RadioInfoManagerradioInfoManager=RadioInfoManager.getInstance(context);List<SignalInformation>signalList=radioInfoManager.getSignalInfoList(0);// slotId=0 主卡for(SignalInformationsignal:signalList){HiLog.info(TAG,"网络类型: "+signal.getNetworkType()+", 信号等级: "+signal.getSignalLevel());}// 注册状态观察者classMyRadioStateObserverextendsRadioStateObserver{publicMyRadioStateObserver(intslotId){super(slotId);}@OverridepublicvoidonNetworkStateUpdated(NetworkStatestate){HiLog.info(TAG,"网络状态更新: "+state.getState());}@OverridepublicvoidonSignalInfoUpdated(List<SignalInformation>signalInfoList){for(SignalInformationsignal:signalInfoList){HiLog.info(TAG,"信号变化: type="+signal.getNetworkType()+", level="+signal.getSignalLevel());}}}// 添加/移除观察者MyRadioStateObserverobserver=newMyRadioStateObserver(0);radioInfoManager.addObserver(observer);// radioInfoManager.removeObserver(observer);

25.4 SIM 卡状态检查

// 检查 SIM 卡是否在位booleanhasSim=radioInfoManager.hasSimCard(0);// slotId=0if(!hasSim){showTip("请插入 SIM 卡");return;}

代码速查卡

API功能示例
RadioInfoManager.getInstance(context)获取电话服务管理实例RadioInfoManager.getInstance(context)
getSignalInfoList(slotId)获取信号信息列表radioInfoManager.getSignalInfoList(0)
hasSimCard(slotId)检查 SIM 卡是否在位radioInfoManager.hasSimCard(0)
addObserver(observer)注册状态观察者radioInfoManager.addObserver(observer)
removeObserver(observer)移除状态观察者radioInfoManager.removeObserver(observer)
signal.getNetworkType()获取网络类型signal.getNetworkType()
signal.getSignalLevel()获取信号等级signal.getSignalLevel()

与 Android/iOS 对比

特性HarmonyOSAndroidiOS
信号信息RadioInfoManagerTelephonyManagerCTTelephonyNetworkInfo
状态监听RadioStateObserverPhoneStateListenerNotificationCenter
网络类型SignalInformationNetworkTypeCTRadioAccessTechnology
SIM 卡检查hasSimCard()getSimState()CTTelephonyNetworkInfo

⚠️ 踩坑回忆录

拔掉 SIM 卡后应用崩溃了

我的信号监听 App 在没有 SIM 卡的设备上直接崩溃,因为没有处理getSignalInfoList返回空列表或 null 的情况。正确做法是先调用hasSimCard(slotId)检查 SIM 卡是否在位,不在位时给出提示而非继续操作。

另外,RadioStateObserver在不需要时一定要记得removeObserver(),否则会造成内存泄漏,Ability 销毁后观察者还在被系统回调。


必做实操任务

序号任务难度
1获取并展示当前信号强度和网络类型
2实现信号变化的实时监听 UI
3检查 SIM 卡状态并展示双卡信息
4实现网络类型变化的提示(如从 5G 降到 4G)
5实现一个信号监测仪表盘 App

学习检查清单

  • 能使用 RadioInfoManager 获取信号信息
  • 能区分 2G/3G/4G/5G 网络类型
  • 能使用 RadioStateObserver 监听信号变化
  • 知道为什么要先检查 SIM 卡状态
  • 能正确添加和移除状态观察者
  • 理解 slotId 的含义(双卡场景)
  • 能处理无 SIM 卡的异常情况
  • 知道 5G NR 对应的 NetworkType 值

进阶方向

  • 实现基于网络类型的智能策略(如 5G 时高清播放,4G 时标清播放)
  • 结合第 24 章网络管理,实现综合网络质量评估
  • 探索蜂窝网络和 WLAN 的自动切换策略
    无 SIM 卡的异常情况
  • 知道 5G NR 对应的 NetworkType 值

进阶方向

  • 实现基于网络类型的智能策略(如 5G 时高清播放,4G 时标清播放)
  • 结合第 24 章网络管理,实现综合网络质量评估
  • 探索蜂窝网络和 WLAN 的自动切换策略
← 返回列表