第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 值 | 网络类型 | 说明 |
|---|---|---|
| 0 | UNKNOWN | 未知网络 |
| 1 | GPRS | 2.5G |
| 2 | CDMA | 2G CDMA |
| 3 | EVDO | 3G CDMA |
| 4 | WCDMA | 3G WCDMA |
| 5 | LTE | 4G |
| 6 | NR | 5G(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 对比
| 特性 | HarmonyOS | Android | iOS |
|---|---|---|---|
| 信号信息 | RadioInfoManager | TelephonyManager | CTTelephonyNetworkInfo |
| 状态监听 | RadioStateObserver | PhoneStateListener | NotificationCenter |
| 网络类型 | SignalInformation | NetworkType | CTRadioAccessTechnology |
| 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 的自动切换策略
