关闭

Android 5.0 呼叫流程--呼入

标签: Android5.0呼叫流程telephony
3529人阅读 评论(7) 收藏 举报
分类:

 

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
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:149841次
    • 积分:2333
    • 等级:
    • 排名:第16010名
    • 原创:89篇
    • 转载:20篇
    • 译文:0篇
    • 评论:45条
    最新评论