第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 的自动切换策略
相关推荐
马剑威(威哥爱编程)1 小时前
【共创稿事节】HarmonyOS 7 互动卡片实战:摇一摇触发静态转动态,前景元素出框
华为·harmonyos
贾伟康2 小时前
【HarmonyOS 7新能力|029】3DGS工程封装:把接入逻辑放进可维护的分层结构
harmonyos·arkts·三维重建·3dgs·harmonyos 7
马剑威(威哥爱编程)2 小时前
【共创稿事节】HarmonyOS 7 闪控窗实战:标准悬浮窗、侧边栏暂存与闪控球一键切换
华为·harmonyos
贾伟康3 小时前
【HarmonyOS 7新能力|019】平行视界入门实战:从能力边界到最小可运行链路
harmonyos·arkts·arkui·harmonyos 7·平行视界
技术任我行XTing4 小时前
【DFX系列】Flutter 鸿蒙应用外接纹理介绍及问题定位
flutter·harmonyos
三翼鸟数字化技术团队4 小时前
WiFi-DensePose × OpenHarmony 智慧家居融合
harmonyos
HarmonyOS_SDK4 小时前
AI 赋能 Push Kit 场景化消息开发,高效完成鸿蒙应用推送能力接入
harmonyos
大雷神5 小时前
【共创稿事节】HarmonyOS ArkGraphics 3D实操——做一个可暂停、可拖动的音箱场景动画
harmonyos
anthonyzhu5 小时前
MacOS27 x86限制引发的pod的问题处理
华为·harmonyos
贾伟康5 小时前
【HarmonyOS 7新能力|030】沉浸光感工程封装:把接入逻辑放进可维护的分层结构
harmonyos·arkts·arkui·harmonyos 7·交互动效