Android5.1 Telecomm层通话去电流程两路进程分析之一通话去电流程框架介绍

2019-04-13 21:23发布

1.1 通话去电流程框架介绍

概述:Android5.1相对于以往的平台对通话功能做了很大程度上的修改,在这里,差异性我们到最后去分析,我们先看通话去电的大概结构,在这之前我先提出几点疑问,比如通话过程不可避免涉及到通话连接,整个通话架构是建立在通话连接之上,只有建立了通话连接之后,很多功能比如接听挂断才能真正实现,那么第一点我们就要知道这个通话连接是在什么时候创建,创建完了之后又有了什么动作,通话界面在什么时候什么地方被显示启动,是通过广播启动还是其他方式?通话连接创建和每路通话的保存的先后顺序是怎样的,异步还是同步,这些问题都很值得研究,接下来就基于这几点做重点解析。   在这里我们选择从拨号盘拨号开始。

1.拨号键盘拨号时触发DialpadFragment.java(packages/apps/Dialer)中的handleDialButtonPressed方法,调用:

final Intent intent = CallUtil.getCallIntent(number,
      (getActivity() instanceof DialtactsActivity ?
((DialtactsActivity) getActivity()).getCallOrigin() : null));
DialerUtils.startActivityWithErrorToast(getActivity(), intent);
    hideAndClearDialpad(false);

前面的逻辑主要处理了号码不符合要求的情况,在这里跟踪代码即可知道,得到的action是CALL_PRIVILEGED,最后进入的是telecomm层的CallActivity.java,在这里做了一个中转,然后进入CallReceiver.java中的processOutgoingCallIntent()中,在这里要注意进入的不是outgoingBroadcaster.java,5.0/5.1之后都是走的telecomm来处理通话;

2.拨号流程中从CallActivity.java接收到广播开始转发到CallReceiver.java中接收到拨号请求:

Call call = getCallsManager().startOutgoingCall(handle, phoneAccountHandle, clientExtras);
if (call != null) {
NewOutgoingCallIntentBroadcaster broadcaster = new NewOutgoingCallIntentBroadcaster(context, getCallsManager(), call, intent, isDefaultDialer);
final int result = broadcaster.processIntent();
final boolean success = result == DisconnectCause.NOT_DISCONNECTED;
if (!success && call != null) {
   disconnectCallAndShowErrorDialog(context, call, result);
  }
}

这里需要解释一下,从这一步开始往下通话去电分成了两路进程,分别是:

a.CallsManager调用 startOutgoingCall开始显示通话界面流程:具体包括了每路通话的保存处理,状态保存,通话界面显示的预处理,以及发送AT指令至底层实现物理拨号;

b.创建去电通话连接:众所周知,通话的必须提交是必须要先建立通话连接才能实现真正的通话,通话连接会设置对方号码,然后等待底层调用实现双方连接通话;   接下来我们具体分析每路进程要做的工作以及这两路流程之间的联系。