一、简介
通话应用主要提供通话相关用户交互界面,根据电话服务子系统提供的通话数据和状态显示语音去电界面、语音来电界面、语音通话界面、语音多方通话界面、会议通话界面、会议管理界面;并根据用户界面上的操作完成接听、挂断、拒接、静音、保持、音频通道切换、DTMF键盘指令等下发电话服务子系统。
二、架构图
三、代码结构
/applications_call
├── callui # 通话应用主Ability,提供拉起应用入口
│ └── src
│ └── main
│ ├── ets # ets代码目录
│ ├── default
│ ├── assets # 图片资源
│ ├── common # 公共组件或方法配置目录
│ ├── components # 公共组件
│ ├── configs # 应用配置对象目录
│ ├── constant # 应用常量对象目录
│ ├── utils # 公共方法
│ ├── model # Model层代码目录
│ ├── pages # 通话页面目录
| ├── app.ets # 全局ets逻辑和应用生命周期管理文件
│ ├── ServiceAbility # 服务ability
│ ├── callManagerService.ets # ServiceAbility方法
│ ├── service.ts # ServiceAbility方法
│ ├── telephonyApi.ets # ServiceAbility方法
│ ├── resources # 资源配置文件存放目录
| ├── base # 默认图片资源,字体大小,颜色资源存放目录
| ├── zh_CN # 中文语言场景资源内容存放目录
│ ├── config.json # 全局配置文件
├── figures # 架构图目录
│ └── callui_en.png # 架构设计图
├── signature # 签名证书文件目录
│ └── com.ohos.callui.p7b # 签名文件
├── LICENSE # 许可证
四、流程图
五、时序图
六、源码分析
1、启动通话常驻服务
开机启动 通话应用常驻服务PA, 由元能力子系统拉起 代码路径/foundation/aafwk/standard/services/abilitymgr/src/ability_manager_service.cpp
void AbilityManagerService::StartingPhoneServiceAbility()
{
HILOG_DEBUG("%{public}s", __func__);
auto bms = GetBundleManager();
CHECK_POINTER_IS_NULLPTR(bms);
AppExecFwk::AbilityInfo phoneServiceInfo;
Want phoneServiceWant;
phoneServiceWant.SetElementName(AbilityConfig::PHONE_SERVICE_BUNDLE_NAME,
AbilityConfig::PHONE_SERVICE_ABILITY_NAME);
auto userId = GetUserId();
int attemptNums = 1;
HILOG_DEBUG("%{public}s, QueryAbilityInfo, userId is %{public}d", __func__, userId);
IN_PROCESS_CALL_WITHOUT_RET(
while (!(bms->QueryAbilityInfo(phoneServiceWant,
OHOS::AppExecFwk::AbilityInfoFlag::GET_ABILITY_INFO_DEFAULT, userId, phoneServiceInfo)) &&
attemptNums <= MAX_NUMBER_OF_CONNECT_BMS) {
HILOG_INFO("Waiting query phone service ability info completed.");
usleep(REPOLL_TIME_MICRO_SECONDS);
attemptNums++;
}
);
(void)StartAbility(phoneServiceWant, userId, DEFAULT_INVAL_VALUE);
}
2、服务注册监听
service