第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 信号信息获取与状态监听

java 复制代码
// 获取信号信息
RadioInfoManager radioInfoManager = RadioInfoManager.getInstance(context);
List<SignalInformation> signalList =
    radioInfoManager.getSignalInfoList(0); // slotId=0 主卡
for (SignalInformation signal : signalList) {
    HiLog.info(TAG, "网络类型: " + signal.getNetworkType()
        + ", 信号等级: " + signal.getSignalLevel());
}

// 注册状态观察者
class MyRadioStateObserver extends RadioStateObserver {
    public MyRadioStateObserver(int slotId) { super(slotId); }

    @Override
    public void onNetworkStateUpdated(NetworkState state) {
        HiLog.info(TAG, "网络状态更新: " + state.getState());
    }

    @Override
    public void onSignalInfoUpdated(List<SignalInformation> signalInfoList) {
        for (SignalInformation signal : signalInfoList) {
            HiLog.info(TAG, "信号变化: type=" + signal.getNetworkType()
                + ", level=" + signal.getSignalLevel());
        }
    }
}

// 添加/移除观察者
MyRadioStateObserver observer = new MyRadioStateObserver(0);
radioInfoManager.addObserver(observer);
// radioInfoManager.removeObserver(observer);

25.4 SIM 卡状态检查

java 复制代码
// 检查 SIM 卡是否在位
boolean hasSim = radioInfoManager.hasSimCard(0); // slotId=0
if (!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 的自动切换策略
相关推荐
懿路向前2 小时前
【HarmonyOS学习笔记】2026-08-05 | 端插件卡片绑定与跨上下文判断
笔记·学习·ai编程·harmonyos
程序员黑豆5 小时前
鸿蒙应用开发:V1与V2版本数据持久化实战教程
前端·harmonyos
程序员黑豆9 小时前
鸿蒙开发 Navigation 路由教程:从入门到实战
前端·harmonyos
HarmonyOS_SDK16 小时前
借助AR Engine人脸识别与跟踪能力,直播不露脸也生动
harmonyos
程序员黑豆18 小时前
鸿蒙应用开发 @BuilderParam 使用教程:实现灵活的 UI 插槽
前端·harmonyos
HMS Core19 小时前
基于人体骨骼点识别与跟踪,实现低时延体感游戏
游戏·华为·harmonyos
凡泰AI19 小时前
APP同时覆盖了iOS、安卓和鸿蒙,如何选择混合开发架构才能减少重复建设,提高功能上线效率~
android·ios·harmonyos·mpaas·uni·小程序容器
XR12345678819 小时前
政府办公楼网络搭建方案对比:信锐、华为、华三选型指南
网络·华为
达子66619 小时前
第23章_HarmonyOs开发图解之 WLAN
华为·harmonyos