当前位置: 首页 > news >正文

Telephony Call

1、Telephony 架构

        Telephony整体架构和Android架构一样的,包括APP层,框架层,HAL层,内核层。        

        其中HAL层不同平台实现方式不同,其中MTK SPRD 平台使用AT通道的方式实现,高通使用QMI方式实现。

       

2、通话业务介绍 

        APP包括Dialer.apk、TeleService.apk、Telecom.apk。其中Dialer.apk跑在com.android.dialer进程中,TeleService.apk跑在常驻进程com.android.phone进程中,Telecom.apk跑在system进程中。框架包括包括 telephony fw、telecom fw。Code分别位于frameworks/opt/telephony、frameworks/base/telecomm。

        Android 5.0是 只有Dialer和TeleService 这个两个APP。Google为了解除通话app和系统框架的耦合,Android 6.0新增了Telecom apk。并提供系统接口设置默认的通话APP。具体逻辑在Telecom.apk中。

2.1、Telecom的启动过程

       虽然 Telecom app设置了android:directBootAware="true",提前启动属性。

       但是将telecom service注册并拉起,并不是AMS执行Telecom app所执行的,而是在开机时框架执行的,具体流程如下。

 相关开机Log打印如下

2.2、TeleService的启动过程

      TeleService一般也称为phone进程, phone进程设置了android:directBootAware="true",系统启动完成后,会将phone进程拉起。

      phone进程的启动过程大致如下,android版本不同,细节处还有所差异。

相关启动Log如下

2.3、RILD的启动 

      不同平台,RILD启动不一样,需要参考不同平台代码,如有兴趣,可以参考此案例分析过程。

MTK RILD 无法启动问题分析_mtkrilj-CSDN博客

3、去电流程

其中,蓝色表示普通CS通话,红色表示VOLTE通话

3.1、Dialer->Telecom

        通话流程比较复杂,Dialer调用TelecomService服务的placeCall来进行通话。

        Telecom app 中CallsManager会执行startOutgoingCall 主要建立通话Call对象,实现Dialer和Telecom双向Binder通信。 其bind详细流程如下。

        Telecom 保存了Dialer的IInCallService 对象用于通知通话状态,而Dialer则保存了Telecom的的IInCallAdapter对象用于操作通话,如暂停挂断,DTMF等,实现两个进程间双向通信。

3.2、Telecom->Telephony->Framework

        placeOutgoingCall主要建立通话Call对应框架Connection,实现Telecom和TeleService双向Binder通信。

3.3、 Framwork->IMS

        framework中创建ImsCall对象,与IMS apk中的ImsCallSessionProxy进行双向通信,ImsCall中保存 IMS apk中的ImsCallSession对象,ImsCallSessionProxy中保存ImsCallSessionListener进行双向通信,其具体类图如下。

3.4、相关Log如下

4、来电流程

其中,蓝色表示普通CS通话,红色表示VOLTE通话

4.1、IMS->Framwork

4.2、Telephony->Telecom->InCallUI

4.3、相关Log如下

5、三方通话和电话会议

5.1、三方通话

        通话支持一路Active状态,一路Hold状态。用户可以在两路通话之间进行切换。

//Dialer三方
12-28 15:27:58.334 I/DialerCallList(21480): com.android.incallui.call.CallList.onUpdateCall:845 [DialerCall_6, ONHOLD, [Capabilities: CAPABILITY_SUPPORT_HOLD CAPABILITY_MUTE CAPABILITY_SUPPORTS_VT_REMOTE_RX CAPABILITY_SUPPORTS_VT_REMOTE_TX CAPABILITY_SUPPORTS_VT_REMOTE_BIDIRECTIONAL], [Properties:], children:[], parent:null, conferenceable:[Call [id: TC@12, state: ACTIVE, details: [i

http://www.lryc.cn/news/440528.html

相关文章:

  • Python--TCP/UDP通信
  • 【已解决】请教 “Sa-Token 集成 xxl-job,报错:非 web 上下文无法获取 HttpServletRequest” 如何解决
  • Redis——常用数据类型string
  • 架构设计:负责网络、定时、坐下、站起、重连等,支持多类游戏的无锁房间
  • 个人随想-gpt-o1大模型中推理链的一个落地实现
  • python解析ip范围,判断ip是否在ip范围内
  • Springboot错误日志切面,找到post请求体被消费后的数据
  • 【二十】【QT开发应用】listwidget右键菜单和删除item
  • LabVIEW机动车动态制动性能校准系统
  • Linux(CentOS8)服务器安装RabbitMQ
  • R语言进行无序多分类Logistic回归
  • Maven从入门到精通(三)
  • Red Hat 和 Debian Linux 对比
  • Axure设计之全屏与退出全屏交互实现
  • 如何测试出自己电脑的网络速度(网速)?
  • 如何利用AI进行有效的科技产品发布
  • 二层、三层网络基本原理
  • 全面掌握 Jest:从零开始的测试指南(上篇)
  • Go 交叉编译
  • goctl安装失败
  • DebateGPT:通过多智能体辩论监督微调大模型
  • 【最新综述】基于深度学习的超声自动无损检测(下)
  • kali——tshark的使用
  • TortoiseSVN图标不显示的解决
  • Oracle 11gR2打PSU补丁详细教程
  • 2.4 卷积1
  • OA项目值用户登入首页展示
  • 如何关闭前端Chrome的debugger反调试
  • 硬件工程师笔试面试——晶振
  • 如何用安卓玩Java版Minecraft,安卓手机安装我的世界Java版游戏的教程