Android Telephony控制通话消息下发流程_Android

 Telephony控制通话消息下发流程

通话相关代码名称统一约定及运行进程汇总

路径

统称

进程

packages/app/Dialer

Dialer

com.android.dialer

packages/service/telecomm

telecom

system_service

packages/service/telephony

TeleService

com.android.phone

framework/base/telecomm

framework

无进程只是提供调用framwork

framework/opt/Telephony

telephony

system_service或com.android.phone

首先拨号流程和来电流程分析在前几篇中写道过​​来电流程​​,​​拨号流程​​。

我们在通话界面若想更改当前通话状态,比如挂断/接听当前接收来电,挂断/保持当前通话等操作,可以理解为是控制消息下发的过程,从Dialer——>Telecom——>TeleService——>RIL——>Modem,通话控制消息一层一层的下发,最终交给Modem处理具体的通话控制。通话状态更改完成后,在将通话状态变更的消息一层一层的上报,最后交给Dialer应用对通话界面进行更新和显示。

Android Telephony控制通话消息下发流程_Android_02

这里需要关注几个重点

三个应用的控制消息传递

      Dialer应用展示的通话界面或来电界面均有控制通话状态请求的界面控制,通过滑动或是点击相关的控件,将触发通话转态控制,调用android.telecom.Call对象的hold方法,如步骤1,在步骤3的Dialer应用中,调用IInCallAdapter的holdCall服务接口完成第一次的跨进程服务接口调用,进入Telecom应用。Telecom应用首先更新Call状态,此处的Call对象为Telecom应用内部定义的类com.android.service.telecom.Call,步骤8调用IConnectionService的hold服务接口,完成第二次的款进程服务接口调用,进入到TeleService应用。TeleService应用中经过层层方法调用,由GsmCdmaCallTracker对象进行Call的hold操作,并将请求发给RIL对象,发出对应的RIL请求

IInCallAdapter接口汇总

IICallAdapter的Stub接口实现在Telecom应用的InCallAdapter类中,他主要由answerCall,rejectCall,playDtmfTone,mergeConference等接口构成;InCallAdapter对象则在InCallController对象绑定,IInCallService成功后创建。

IConnectionService接口汇总

IConnectionService的Stub接口实现在framework/base下的ConnectionService抽象类的匿名内部类中,mBinder为其对象,他主要由addConnectionServiceAdapter,createConnection等创建TelephonyConnection接口,以及answer,reject,hold,playDtmfTone等控制通话状态的接口构成。而在TeleService应用中,TelephonyConnectionService继承了抽象类TelephonyConnection。

Android通话模型,Dialer,telecom和TeleService三个系统应用主要负责的业务及运行进程空间,结合这四个通话的核心流程,可以抽象出模型,可以站在更高的层次去认识和理解Android Telephony通话功能。

流程图:

Android Telephony控制通话消息下发流程_Android_03

系统的分层 

       Dialer,Telecom和TeleService三大应用可以理解为:Dialer应用是普通的Android  App应用,其运行进程的用户信息和进程信息,也能说明此问题;Telecom应用运行在system_service进程上,其进程用户名为system系统用户,说明他在运行在Android Framework框架层;TeleService应用运行的进程名是com.android.phone,用户名是radio,承载着Telephony Call协议栈,同样可以认为他运行在Android Framewrok框架层;最后RIL他运行在HAL(硬件抽象层)。

交互方式

      Dialer,Telecom,TeleService和RIL都是通过服务进行交互的,在图中,他们之间有箭头连接的都是通过Service跨进程的接口调用实现的。Dialer与TeleService之间没有直接的消息传递,要通过Telecom进行消息中转,Telecom与RIL直接同样没有直接的消息传递,要通过TeleService进行消息中转。

       通过服务进行跨进程接口调用实现消息的传递,服务接口调用本身就是同步的接口调用,在Service端的实现将转换为异步方式处理,待消息处理完成后,在使用回调的接口传递消息处理的结果

分解通话相关流程

根据消息的传递方向,可分成两大类

        第一类 控制通话消息下发流程 : 应用层通过框架层向RIL发起通话管理和控制相关RIL请求,RIL转换成对应的消息发发送给Modem执行,其中包括拨号,接听电话,拒接电话,保持,恢复通话等。

       第二类 为通话状态更新消息上报流程 :RIL收到的Modem的通话状态变化通知,通过框架层向应用层发起通话状态变化通知,包括来电,电话接通,进入通话中等。