Android 5.0 呼叫流程--呼入

 

1.1         MT call

我们先给出MT起呼过程的示例流程图,然后结合该图做代码流程的分析:

普通来电的流程,从RIL层开始,其流程如下,

 

 

 

 

 

具体的流程分析就不做文字阐述了,对着流程图看代码即可。

 

需要注意的是要有Telephony的框架意识和通信链路的相互关联关系,这些在其他文章里有讲述。

 

 

下面是一些简单的笔记摘要

1.1.1   来电提示(IncallUI

 

5.3.3.1.     通用部分: telecomm到应用

   

在应用部分,在CallList里,当Phone.ListeneronCallAdded被调用时,根据来电状态Call.State.INCOMING,调用CallList. onIncoming(),它会把这个事件发送给向CallList注册的监听器listener.onIncomingCall(call)

CallButtonPresenter.java (cp_incallui_5.0\src\com\android\incallui):        InCallPresenter.getInstance().addListener(this);

CallCardPresenter.java (cp_incallui_5.0\src\com\android\incallui):        InCallPresenter.getInstance().addListener(this);

ConferenceManagerPresenter.java (cp_incallui_5.0\src\com\android\incallui):        InCallPresenter.getInstance().addListener(this);

DialpadPresenter.java (cp_incallui_5.0\src\com\android\incallui):        InCallPresenter.getInstance().addListener(this);

VideoCallPresenter.java (cp_incallui_5.0\src\com\android\incallui):        InCallPresenter.getInstance().addListener(this);         

 

InCallPresenter.java里,onIncomingCall被调用,它再调用监听器的onIncomingCall

    public void onIncomingCall(Call call) {

        InCallState newState = startOrFinishUi(InCallState.INCOMING);

        InCallState oldState = mInCallState;

 

        Log.i(this, "Phone switching state: " + oldState + " -> " + newState);

        mInCallState = newState;

 

        for (IncomingCallListener listener : mIncomingCallListeners) {

            listener.onIncomingCall(oldState, mInCallState, call);

        }

 

        if (CallList.getInstance().isDsdaEnabled() && (mInCallActivity != null)) {

            mInCallActivity.updateDsdaTab();

        }

    }         

向它注册的监听器存放在mIncomingCallListeners里,注册过程在每个应用里,使用addIncomingCallListener方法进行注册:

CallButtonPresenter.java (packages\apps\incallui\src\com\android\incallui):        InCallPresenter.getInstance().addIncomingCallListener(this);

CallCardPresenter.java (packages\apps\incallui\src\com\android\incallui):        InCallPresenter.getInstance().addIncomingCallListener(this);

VideoCallPresenter.java (packages\apps\incallui\src\com\android\incallui):        InCallPresenter.getInstance().addIncomingCallListener(this);         

 

 

5.3.3.2.     视频来电

   

VideoCallPresenter是它的一个监听器,之后在自己的onIncomingCall里调用onStateChange,之后会调用enterVideoMode进入视频模式,

enterVideoMode里面有几个重要工作,包括对surface的设置和camera的处理,

    private void enterVideoMode(int newVideoState) {

 

        ui.showVideoUi(true);

 

               enableCamera(isCameraRequired);

 

            if (ui.isDisplayVideoSurfaceCreated()) {

                Log.d(this, "Calling setDisplaySurface with " + ui.getDisplayVideoSurface());

                mVideoCall.setDisplaySurface(ui.getDisplayVideoSurface());

            }

    }

 

对于变量ui,从对VideoCallUi实例创建的分析过程我们知道,它就是VideoCallFragment,所以ui.showVideoUi就是VideoCallFragment.showVideoUi,它通过inflateVideoCallViews创建VideoCallSurface,实现监听接口,并关联TextureView

 

enableCamera在其他章节分析过,它是通过接口,打开底层的camera

 

 

5.3.3.1.     普通来电

   

 

InCallPresenter showInCall()的调用会拉起来电界面。

 

CallCardPresenter实例的创建:

如同VideoCallPresenterCallCardPresenter先在其相关类CallCardFragment通过createPresenter方法创建,createPresenter方法则在CallCardFragment的父类BaseFragment的构造函数里被调用,就是所在CallCardFragment类创建的时候,就创建了CallCardPresenter

 

CallCardPresenter通过InCallPresenter.getInstance().addListener(this)InCallPresenter注册,在CallCardPresenter.onUiReady里。

CallCardPresenter.onUiReadyBaseFragmentonActivityCreated调用。

 

CallCardFragmentIncall_screen.xml作为控件,布局加载时被初始化,在InCallActivity.javainitializeInCall被赋值给引用。

CallCardFragmentonCreateView会加载自己的布局文件call_card_content

 






如果觉得我的文章对您有用,请打赏。您的支持是对我莫大的认可


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值