OpenHarmony 通话应用源码剖析 原创 精华
作者:赖尧
一、简介
通话应用主要提供通话相关用户交互界面,根据电话服务子系统提供的通话数据和状态显示语音去电界面、语音来电界面、语音通话界面、语音多方通话界面、会议通话界面、会议管理界面;并根据用户界面上的操作完成接听、挂断、拒接、静音、保持、音频通道切换、DTMF键盘指令等下发电话服务子系统。
二、架构图
三、代码结构
四、流程图
五、时序图
六、源码分析
1、启动通话常驻服务
开机启动 通话应用常驻服务PA, 由元能力子系统拉起 代码路径/foundation/aafwk/standard/services/abilitymgr/src/ability_manager_service.cpp
2、服务注册监听
service ability 应用启动加载入口文件service.ts文件, 执行onStart钩子函数, 实例化CallManagerService类时添加注册监听, registerCallStateCallback 调用注册电话子系统接口function on(type: ‘callDetailsChange’, callback: Callback<CallAttributeOptions>): void;
添加注册监听子系统上报的状态
根据上报通话当前状态校验是来电还是去电如果是就做拉起操作, 否则通话发布公共事件;
3、服务注册公共事件广播
在启动注册监听后同时也注册添加公共事件广播, 其中’callui.event.callEvent’事件监听通话FA获取初始化数据, ‘callui.event.click’ 事件监听systemui 通知栏操作按钮事件;
4、拉起通话应用初始化数据
在service中通过 PA.startAbility方法拉起 通话FA应用, 通话应用FA在启动入口页面index, 实例化CallManager类,调用initCallData方法, 获取初始通话数据, 调用update更新通话状态;
5、更新通话状态
在CallManger类实例化时候, 添加公共事件广播监听’callui.event.callDetailsChange’, 应用中订阅到数据调用callDataManager中的update方法,更新callData和callList校验通话状态, 是单方通话或者是多方通话;
通话状态callState 包含的类型:
6、发布通知
在通话应用切换到后台, 会触发onPageHide钩子函数发送通知, 其中notificationManager.sendNotification方法发送按钮通知, notificationManager.sendCapsuleNotification方法发送的是胶囊通知;
发布按钮通知, 配置actionButtons, 其中消息类型contentType 等于 notification.ContentType.NOTIFICATION_CONTENT_LONG_TEXT, 表示长消息类型, want下的 action配置为’callui.event.click’, 点击通知按钮会触发systemUI 中的WantAgent.trigger 系统会发布公共事件’callui.event.click’,在通话service中订阅
公共事件’callui.event.click’响应的数据
七、列举调用电话子系统接口
1、来电接听, 拒接;通话中挂断, 保持, 取消保持接口调用;
2、拨号盘拨号接口调用
更多原创内容请关注:深开鸿技术团队
入门到精通、技巧到案例,系统化分享HarmonyOS开发技术,欢迎投稿和订阅,让我们一起携手前行共建HarmonyOS生态。
赞,感谢整理!
call.on('callDetailsChange')这个api在3568上不回调,大佬你那边这个能调成功吗
call.on('callDetailsChange')这个接口使用api7打包是ok的, 使用api8 打包项目, n-api底层ACE出现崩溃问题, OpenHarmony那边还没有解决