精华内容
下载资源
问答
  • 电话呼叫流程图电话呼叫流程图电话呼叫流程图电话呼叫流程图电话呼叫流程图电话呼叫流程图电话呼叫流程图电话呼叫流程图电话呼叫流程图电话呼叫流程图电话呼叫流程图电话呼叫流程图电话呼叫流程图电话呼叫流程图
  • 呼叫流程图

    2008-05-16 17:37:16
    完整的呼叫流程 移动通信简单的介绍
  • GSM呼叫流程图

    2011-09-24 10:42:14
    GSM呼叫流程图 移动台的呼入接续过程: 1、寻呼。MSC/VLR在数据库中查出用户的资 料并向相 关的BSC发送寻呼信息。该信息包含用户所在区域的 LAI和用户的IMSI或者TMSI。 2、寻呼命令。BSC向LA区内的所有BTS发出寻呼...
  • A点呼叫B点接受,详解MS到MS端的流程
  • 呼叫流程图文简介

    千次阅读 2013-07-09 23:08:53
    有空会补上,原帖是没有的。) 首先先介绍一下中的设备:  BTS 基站,一般为我们看到的信号塔下的小房子里面的设备  BSC为基站控制器, 一般在运营商机房中摆放,通常控制多个BTS工作,  ...

    (图有空会补上,原帖是没有图的。)


    首先先介绍一下图中的设备: 


    BTS 基站,一般为我们看到的信号塔下的小房子里面的设备  

    BSC为基站控制器, 一般在运营商机房中摆放,通常控制多个BTS工作,  

    以上两个为BSS系统,也就是无线接入系统。顾名思义为与我们手机信号等相关信息有关。  

    MSC为程控交换机 ,就是一般在市局机房里面,我们电话完成线路交换的重要设备。  

    HLR 为归属位置寄存器,存放号码资源,我们用户的信息等以及一些智能业务、电话费用等均在里面存放,是一个大型数据库。  

    VLR拜访位置寄存器,在下图中没有标注,因为现在的交换机设备已经将VLR功能包括了也就是说VLR与MSC是一个设备了,他的功能是临时存放用户号码资源以及控制电话接续资源等相关功能。

    下面将从按照一个最简单的电话接续流程来给大家讲解一下电话是怎么接续的。  

     

    1,首先为手机A拨打手机B 在这里A的号码为MSISDN 35860220001,这个号码可以理解为平时我们使用的8613XXXXXXXXX,那么现在就清晰了。当我们的手机通过信号塔呼叫B的号码060220002,这个时候BTS、BSC将呼叫信号透明传输给MSC进行分析。 

     

    2、MSC收到下面传来的信号,并且进行分析(中间还根据情况判断主叫和被叫的权限等),分析到被叫号码为我们正常用的MSISDN手机号码 060220002(在中国为13XXXXXXXXX) 

     

    3、通过这个号码060220002(在中国为13XXXXXXXXX)的前几位就能判断出这个号码归属在哪个HLR下面,并且同时向HLR发出所要改号码的信息资源,以便下一步电话接续之用。 

     

    4、消息到达HLR后,HLR通过被叫的号码MSISDN查询本身的数据库,在数据库对应的表中找到相关的信息,这里我们看到IMSI号码,其实这个号码才是为我们手号码的真是身份,里面包含的信息较多,我们可以不去理会。只关注下面信息即可如:B号码的当前归属在哪个MSC下 

     

    5、查询完毕之后,注意这个时候使用的为B的IMSI号码而不是MSISDN,然后根据上步找到了MSC2,并且询问MSC2在其归属下的B号码当前情况(例如是否当前具备呼叫条件),这步以及下部中在查询B号码情况的时候都用到了VLR的功能。 

     

    6、通过查询VLR看现在用户的位置信息,属于哪个小区下面,并且是否空闲,如果空闲,则有VLR临时分配一个能体现出自己位置信息的号码MSRN漫游号码(注意这个不是我们经常提到的漫游)3856077XXX,将改号码反馈给HLR。 

     

    7、HLR又将改号码发给主叫号码所在的MSC, 由主叫的MSC进行分析当前所有的号码信息(主要还是看被叫号码的MSRN) 

     

    8、通过分析被叫号码的MSRN 知道原来B手机在MSC2下面,于是直接选择一条线路想MSC2发出呼叫。(在这之前我们是听不到任何回铃音或者彩铃的) 

     

    9、MSC2接受到被叫号码B,一看原来是自己给出去的MSRN ,就知道是别人来找B听电话的, 于是就开始查找VLR表,看是否空隙,找到IMSI 又找到代表目前手机具体位置的TMSI号码(我忘记了是BSC上报给MSC和VLR的,还是VLR分配的了) 

     

    10、最后通过TMSI进行呼叫B的手机,这个时候主叫就能听到彩铃或者回铃音了,被叫的手机开始振铃(关于怎样收听到彩铃属于智能流程,暂不做叙述。)。最后被叫接通电话,释放MSRN这样一个临时资源。
    展开全文
  • IMS 呼叫流程图

    千次阅读 2011-09-03 21:25:12
    http://www.eventhelix.com/ims/
    展开全文
  • 华为呼叫流程内部呼叫控制流程图.doc
  • linphone呼叫流程.pdf

    2019-09-20 14:32:43
    linphone呼叫流程图,自己一步一步整理出来,现在分享出来给大家参考
  • 呼叫中心流程图

    2020-11-18 11:39:43
    呼叫中心系统介绍:https://www.hollycrm.com/callcenter/

    呼叫中心流程图

    呼叫中心系统介绍:https://www.hollycrm.com/callcenter/

    展开全文
  • SIP呼叫转移流程图
  • 中国移动呼叫中心的业务处理流程图 在做系统设计时 有很大的参考价值哟
  • 服务呼叫中心管理管理流程图.doc
  • 文章《Android 4.4 Kitkat Phone工作流程浅析(三)__MO(去电)流程分析》资源下载 http://blog.csdn.net/yihongyuelan/article/details/21069061 主要包含: MTK Android 4.4 拨号时序(多张) MTK Android 4.4 ...
  • 呼叫流程flash-中兴内部制作呼叫流程flash-中兴内部制作
  • SIP呼叫流程典型流程图解及其详细解释
  • 我们先给出MO起呼过程的示例流程图,然后结合该图做代码流程的分析: 我们从CallActivity来开始看MO呼叫流程,在他的processIntent里处理收到的呼叫intent,目前支持3种类型的起呼呼叫,之后...private void ...

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

    0818b9ca8b590ca3270a3433284dd417.png

    我们从CallActivity来开始看MO呼叫流程,在他的processIntent里处理收到的呼叫intent,目前支持3种类型的起呼呼叫,之后processOutgoingCallIntent给CallReceiver发送一个广播,完成本阶段的处理。

    private void processIntent(Intent intent) {

    // Ensure call intents are not processed on devices that are not capable of calling.

    if (!isVoiceCapable()) {

    return;

    }

    verifyCallAction(intent);

    String action = intent.getAction();

    if (Intent.ACTION_CALL.equals(action) ||

    Intent.ACTION_CALL_PRIVILEGED.equals(action) ||

    Intent.ACTION_CALL_EMERGENCY.equals(action)) {

    processOutgoingCallIntent(intent);

    } else if (TelecomManager.ACTION_INCOMING_CALL.equals(action)) {

    processIncomingCallIntent(intent);

    }

    }

    CallReceiver是一个广播接收器,处理所有的来电和去电广播,具体来讲,处理3个广播,来电、拨号盘去电、SIM卡去电,这里分析一下拨号盘呼叫的流程,收到拨号盘的拨号请求后,调用processOutgoingCallIntent进行后续处理。

    public void onReceive(Context context, Intent intent) {

    final boolean isUnknownCall = intent.getBooleanExtra(KEY_IS_UNKNOWN_CALL, false);

    final boolean isIncomingCall = intent.getBooleanExtra(KEY_IS_INCOMING_CALL, false);

    Log.i(this, "onReceive - isIncomingCall: %s isUnknownCall: %s", isIncomingCall,

    isUnknownCall);

    if (isUnknownCall) {

    processUnknownCallIntent(intent);

    } else if (isIncomingCall) {

    processIncomingCallIntent(intent);

    } else {

    processOutgoingCallIntent(context, intent);

    }

    }

    processOutgoingCallIntent实现:

    1)  获取到CallsManager的实例,并调用其方法startOutgoingCall,这里会创建一个Call实例,并通过addCall进行相关的状态维护;

    2)  再新建一个NewOutgoingCallIntentBroadcaster实例,调用其方法processIntent,改变intent的一些参数,使用mCallsManager.placeOutgoingCall发起呼叫,再调用broadcastIntent发一个广播消息ACTION_NEW_OUTGOING_CALL出去。

    呼叫发起的主要流程在placeOutgoingCall里面处理;

    ACTION_NEW_OUTGOING_CALL广播的发送流程和接收器如下:

    private void broadcastIntent(

    Intent originalCallIntent,

    String number,

    boolean receiverRequired) {

    Intent broadcastIntent = new Intent(Intent.ACTION_NEW_OUTGOING_CALL);

    mContext.sendOrderedBroadcastAsUser(

    broadcastIntent,

    UserHandle.CURRENT,

    PERMISSION,

    receiverRequired ? new NewOutgoingCallBroadcastIntentReceiver() : null,

    null,  // scheduler

    Activity.RESULT_OK,  // initialCode

    number,  // initialData: initial value for the result data (number to be modified)

    null);  // initialExtras

    }

    Intent.ACTION_NEW_OUTGOING_CALL的定义如下,

    @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)

    public static final String ACTION_NEW_OUTGOING_CALL =

    "android.intent.action.NEW_OUTGOING_CALL";

    通过AndroidManifest.xml,我们可以看出有两个receiver接收这个intent,

    ProcessOutgoingCallTest.java (packages\services\telephony\src\com\android\phone):

    UndemoteOutgoingCallReceiver.java (packages\apps\dialer\src\com\android\dialer\interactions):

    继续分析呼叫的处理流程,在CallsManager.placeOutgoingCall里,使用之前创建的Call实例的方法call.startCreateConnection,

    void startCreateConnection(PhoneAccountRegistrar phoneAccountRegistrar) {

    Preconditions.checkState(mCreateConnectionProcessor == null);

    mCreateConnectionProcessor = new CreateConnectionProcessor(this, mRepository, this,

    phoneAccountRegistrar, mContext);

    mCreateConnectionProcessor.process();

    }

    这里会创建一个CreateConnectionProcessor实例,并调用其process,通过attemptNextPhoneAccount,调用到service.createConnection,其中service的类型是ConnectionServiceWrapper,它是IConnectionService的子类:

    private void attemptNextPhoneAccount() {…

    ConnectionServiceWrapper service =

    mRepository.getService(

    attempt.connectionManagerPhoneAccount.getComponentName());

    service.createConnection(mCall, new Response(service));

    …}

    final class ConnectionServiceWrapper extends ServiceBinder {…}

    这里又涉及到binder通信,ConnectionServiceWrapper是客户端,ConnectionService是服务端,MO起呼使用了createConnection这个接口方法。

    在ConnectionService端,onCreateOutgoingConnection会被调用到,这个方法被TelephonyConnectionService重写,TelephonyConnectionService是ConnectionService的子类和最终要实例化的类,所以ConnectionService实例的onCreateOutgoingConnection方法在TelephonyConnectionService执行,这个方法代码较多,最终它会调用placeOutgoingConnection(),

    placeOutgoingConnection代码如下,它通过Phone.dial进行拨号,这个就是我们熟悉的流程了,在Android2.3、4.0、4.4都有这个拨号过程,之后将连接信息存放起来。

    private void placeOutgoingConnection(

    TelephonyConnection connection, Phone phone, ConnectionRequest request) {…

    originalConnection = phone.dial(number, request.getVideoState());

    if (originalConnection == null) {…

    } else {

    connection.setOriginalConnection(originalConnection);

    }

    }

    Phone.dial是一个接口,实现的原型在basePhone.dial(dialString),basePhone是GSMPhone的父类,实际上是一个实例是GSMPhone,所以最终调用GSMPhone.dial。代码中mCT则是GsmCallTracker的实例,它在GSMPhone创建的时候被创建,GSMPhone通过它来完成呼叫相关的处理。

    public Connection

    dial (String dialString, UUSInfo uusInfo) throws CallStateException {

    GsmMmiCode mmi = GsmMmiCode.newFromDialString(networkPortion, this, mUiccApplication.get());

    if (LOCAL_DEBUG) Cclog("dialing w/ mmi '" + mmi + "'...");

    //MTK-END [mtk04070][111118][ALPS00093395]Add Cclog

    if (mmi == null) {

    return mCT.dial(newDialString, uusInfo);

    } else if (mmi.isTemporaryModeCLIR()) {

    return mCT.dial(mmi.dialingNumber, mmi.getCLIRMode(), uusInfo);

    } else {

    mPendingMMIs.add(mmi);

    mMmiRegistrants.notifyRegistrants(new AsyncResult(null, mmi, null));

    mmi.processCode();

    // FIXME should this return null or something else?

    return null;

    }

    }

    在GsmCallTracker的dial方法中,会先将音频通道mute,再通过mCi.dial进行拨号,之后再将状态信息更新到应用。

    synchronized Connection

    dial (String dialString, int clirMode, UUSInfo uusInfo) throws CallStateException {

    clearDisconnected();

    setMute(false);

    if (PhoneNumberUtils.isEmergencyNumber(dialString)

    cm.emergencyDial(ret.toString(), clirMode, uusInfo, obtainCompleteMessage(EVENT_DIAL_CALL_RESULT));

    } else {

    cm.dial(ret.toString(), clirMode, uusInfo, obtainCompleteMessage(EVENT_DIAL_CALL_RESULT));

    }

    updatePhoneState();

    phone.notifyPreciseCallStateChanged();

    }

    其中cm是RIL.java的实例,它在PhoneFactory.makeDefaultPhone里被实例化,然后在GsmPhone实例创建的时候,引用被传递给GsmPhone,在GsmPhone的构造函数里,调用其父类PhoneBase的构造方法,给mCi赋值为RIL的引用值,之后GsmPhone就可以使用父类的mCi了,所以mCi.dial即RIL.dial()。

    public static void makeDefaultPhone(Context context) {

    int numPhones = TelephonyManager.getDefault().getPhoneCount();

    sCommandsInterfaces = new RIL[numPhones];

    for (int i = 0; i < numPhones; i++) {

    sCommandsInterfaces[i] = new RIL(context, networkModes[i],

    cdmaSubscription, i);

    }

    for (int i = 0; i < numPhones; i++) {

    PhoneBase phone = null;

    int phoneType = TelephonyManager.getPhoneType(networkModes[i]);

    if (phoneType == PhoneConstants.PHONE_TYPE_GSM) {

    phone = new GSMPhone(context,

    sCommandsInterfaces[i], sPhoneNotifier, i);

    } else if (phoneType == PhoneConstants.PHONE_TYPE_CDMA) {

    phone = new CDMALTEPhone(context,

    sCommandsInterfaces[i], sPhoneNotifier, i);

    }

    Rlog.i(LOG_TAG, "Creating Phone with type = " + phoneType + " sub = " + i);

    sProxyPhones[i] = new PhoneProxy(phone);

    }

    …}

    GSMPhone (Context context, CommandsInterface ci, PhoneNotifier notifier, boolean unitTestMode) {

    super("GSM", notifier, context, ci, unitTestMode);

    mCi.setPhoneType(PhoneConstants.PHONE_TYPE_GSM);

    }

    protected PhoneBase(String name, PhoneNotifier notifier, Context context, CommandsInterface ci,

    boolean unitTestMode, int phoneId) {

    mCi = ci;

    }

    RIL.dial实现如下,封装一个RIL_REQUEST_DIAL类型的消息发送出去,将拨号请求发送给RILD,

    如果是高通平台,RILD会通过QCRIL,以及QMI,和modem进行通信,完成呼叫起呼过程;如果是MTK平台,RILD使用AT指令向modem发送呼叫请求。

    对于RILD之后的处理我们暂不进行分析了。(AT\QMI及modem这部分是feature phone很常规的呼叫流程过程,不是android特色的代码。)

    public void

    dial(String address, int clirMode, UUSInfo uusInfo, Message result) {

    RILRequest rr = RILRequest.obtain(RIL_REQUEST_DIAL, result);

    rr.mp.writeString(address);

    rr.mp.writeInt(clirMode);

    rr.mp.writeInt(0); // UUS information is absent

    if (uusInfo == null) {

    rr.mp.writeInt(0); // UUS information is absent

    } else {

    rr.mp.writeInt(1); // UUS information is present

    rr.mp.writeInt(uusInfo.getType());

    rr.mp.writeInt(uusInfo.getDcs());

    rr.mp.writeByteArray(uusInfo.getUserData());

    }

    send(rr);

    }

    在GsmCallTracker的dial方法中,MTK平台还封装了一个事件为EVENT_DIAL_CALL_RESULT消息,但RIL层响应拨号请求后,被自身的handler处理。(clearDisconnected()和canDial()清空过去的非连接状态的Connections,然后检查是否可以拨打电话。接着检查foregroundCall是否处于Active状态,若是则调用switchWaitingOrHoldingAndActive将它们切换到后台,调用fakeHoldForegroundBeforeDial将前台中的连接全部切换到后台,并且状态变为HOLDING。在进行这些前期检查和准备后,创建一个GsmConnection实例即pendingMO,检查传递过来的电话号码是否有效合法,若不合法则调用pollCallsWhenSafe(),目的是将其标为dropped;若合法则设置为非静音后,调用RIL.dial进行拨号。最后,更新Phone状态并通知给注册者。) 5.

    Android 5.0

    呼叫流程

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

    0818b9ca8b590ca3270a3433284dd417.png

    我们从CallActivity来开始看MO呼叫流程,在他的processIntent里处理收到的呼叫intent,目前支持3种类型的起呼呼叫,之后processOutgoingCallIntent给CallReceiver发送一个广播,完成本阶段的处理。

    private void processIntent(Intent intent) {

    // Ensure call intents are not processed on devices that are not capable of calling.

    if (!isVoiceCapable()) {

    return;

    }

    verifyCallAction(intent);

    String action = intent.getAction();

    if (Intent.ACTION_CALL.equals(action) ||

    Intent.ACTION_CALL_PRIVILEGED.equals(action) ||

    Intent.ACTION_CALL_EMERGENCY.equals(action)) {

    processOutgoingCallIntent(intent);

    } else if (TelecomManager.ACTION_INCOMING_CALL.equals(action)) {

    processIncomingCallIntent(intent);

    }

    }

    CallReceiver是一个广播接收器,处理所有的来电和去电广播,具体来讲,处理3个广播,来电、拨号盘去电、SIM卡去电,这里分析一下拨号盘呼叫的流程,收到拨号盘的拨号请求后,调用processOutgoingCallIntent进行后续处理。

    public void onReceive(Context context, Intent intent) {

    final boolean isUnknownCall = intent.getBooleanExtra(KEY_IS_UNKNOWN_CALL, false);

    final boolean isIncomingCall = intent.getBooleanExtra(KEY_IS_INCOMING_CALL, false);

    Log.i(this, "onReceive - isIncomingCall: %s isUnknownCall: %s", isIncomingCall,

    isUnknownCall);

    if (isUnknownCall) {

    processUnknownCallIntent(intent);

    } else if (isIncomingCall) {

    processIncomingCallIntent(intent);

    } else {

    processOutgoingCallIntent(context, intent);

    }

    }

    processOutgoingCallIntent实现:

    1)获取到CallsManager的实例,并调用其方法startOutgoingCall,这里会创建一个Call实例,并通过addCall进行相关的状态维护;

    2)再新建一个NewOutgoingCallIntentBroadcaster实例,调用其方法processIntent,改变intent的一些参数,使用mCallsManager.placeOutgoingCall发起呼叫,再调用broadcastIntent发一个广播消息ACTION_NEW_OUTGOING_CALL出去。

    呼叫发起的主要流程在placeOutgoingCall里面处理;

    ACTION_NEW_OUTGOING_CALL广播的发送流程和接收器如下:

    private void broadcastIntent(

    Intent originalCallIntent,

    String number,

    boolean receiverRequired) {

    Intent broadcastIntent = new Intent(Intent.ACTION_NEW_OUTGOING_CALL);

    mContext.sendOrderedBroadcastAsUser(

    broadcastIntent,

    UserHandle.CURRENT,

    PERMISSION,

    receiverRequired ? new NewOutgoingCallBroadcastIntentReceiver() : null,

    null,  // scheduler

    Activity.RESULT_OK,  // initialCode

    number,  // initialData: initial value for the result data (number to be modified)

    null);  // initialExtras

    }

    Intent.ACTION_NEW_OUTGOING_CALL的定义如下,

    @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)

    public static final String ACTION_NEW_OUTGOING_CALL =

    "android.intent.action.NEW_OUTGOING_CALL";

    通过AndroidManifest.xml,我们可以看出有两个receiver接收这个intent,

    ProcessOutgoingCallTest.java (packages\services\telephony\src\com\android\phone):

    UndemoteOutgoingCallReceiver.java (packages\apps\dialer\src\com\android\dialer\interactions):

    继续分析呼叫的处理流程,在CallsManager.placeOutgoingCall里,使用之前创建的Call实例的方法call.startCreateConnection,

    void startCreateConnection(PhoneAccountRegistrar phoneAccountRegistrar) {

    Preconditions.checkState(mCreateConnectionProcessor == null);

    mCreateConnectionProcessor = new CreateConnectionProcessor(this, mRepository, this,

    phoneAccountRegistrar, mContext);

    mCreateConnectionProcessor.process();

    }

    这里会创建一个CreateConnectionProcessor实例,并调用其process,通过attemptNextPhoneAccount,调用到service.createConnection,其中service的类型是ConnectionServiceWrapper,它是IConnectionService的子类:

    private void attemptNextPhoneAccount() {…

    ConnectionServiceWrapper service =

    mRepository.getService(

    attempt.connectionManagerPhoneAccount.getComponentName());

    service.createConnection(mCall, new Response(service));

    …}

    final class ConnectionServiceWrapper extends ServiceBinder {…}

    这里又涉及到binder通信,ConnectionServiceWrapper是客户端,ConnectionService是服务端,MO起呼使用了createConnection这个接口方法。

    在ConnectionService端,onCreateOutgoingConnection会被调用到,这个方法被TelephonyConnectionService重写,TelephonyConnectionService是ConnectionService的子类和最终要实例化的类,所以ConnectionService实例的onCreateOutgoingConnection方法在TelephonyConnectionService执行,这个方法代码较多,最终它会调用placeOutgoingConnection(),

    placeOutgoingConnection代码如下,它通过Phone.dial进行拨号,这个就是我们熟悉的流程了,在Android2.3、4.0、4.4都有这个拨号过程,之后将连接信息存放起来。

    private void placeOutgoingConnection(

    TelephonyConnection connection, Phone phone, ConnectionRequest request) {…

    originalConnection = phone.dial(number, request.getVideoState());

    if (originalConnection == null) {…

    } else {

    connection.setOriginalConnection(originalConnection);

    }

    }

    Phone.dial是一个接口,实现的原型在basePhone.dial(dialString),basePhone是GSMPhone的父类,实际上是一个实例是GSMPhone,所以最终调用GSMPhone.dial。代码中mCT则是GsmCallTracker的实例,它在GSMPhone创建的时候被创建,GSMPhone通过它来完成呼叫相关的处理。

    public Connection

    dial (String dialString, UUSInfo uusInfo) throws CallStateException {

    GsmMmiCode mmi = GsmMmiCode.newFromDialString(networkPortion, this, mUiccApplication.get());

    if (LOCAL_DEBUG) Cclog("dialing w/ mmi '" + mmi + "'...");

    //MTK-END [mtk04070][111118][ALPS00093395]Add Cclog

    if (mmi == null) {

    return mCT.dial(newDialString, uusInfo);

    } else if (mmi.isTemporaryModeCLIR()) {

    return mCT.dial(mmi.dialingNumber, mmi.getCLIRMode(), uusInfo);

    } else {

    mPendingMMIs.add(mmi);

    mMmiRegistrants.notifyRegistrants(new AsyncResult(null, mmi, null));

    mmi.processCode();

    // FIXME should this return null or something else?

    return null;

    }

    }

    在GsmCallTracker的dial方法中,会先将音频通道mute,再通过mCi.dial进行拨号,之后再将状态信息更新到应用。

    synchronized Connection

    dial (String dialString, int clirMode, UUSInfo uusInfo) throws CallStateException {

    clearDisconnected();

    setMute(false);

    if (PhoneNumberUtils.isEmergencyNumber(dialString)

    cm.emergencyDial(ret.toString(), clirMode, uusInfo, obtainCompleteMessage(EVENT_DIAL_CALL_RESULT));

    } else {

    cm.dial(ret.toString(), clirMode, uusInfo, obtainCompleteMessage(EVENT_DIAL_CALL_RESULT));

    }

    updatePhoneState();

    phone.notifyPreciseCallStateChanged();

    }

    其中cm是RIL.java的实例,它在PhoneFactory.makeDefaultPhone里被实例化,然后在GsmPhone实例创建的时候,引用被传递给GsmPhone,在GsmPhone的构造函数里,调用其父类PhoneBase的构造方法,给mCi赋值为RIL的引用值,之后GsmPhone就可以使用父类的mCi了,所以mCi.dial即RIL.dial()。

    public static void makeDefaultPhone(Context context) {

    int numPhones = TelephonyManager.getDefault().getPhoneCount();

    sCommandsInterfaces = new RIL[numPhones];

    for (int i = 0; i < numPhones; i++) {

    sCommandsInterfaces[i] = new RIL(context, networkModes[i],

    cdmaSubscription, i);

    }

    for (int i = 0; i < numPhones; i++) {

    PhoneBase phone = null;

    int phoneType = TelephonyManager.getPhoneType(networkModes[i]);

    if (phoneType == PhoneConstants.PHONE_TYPE_GSM) {

    phone = new GSMPhone(context,

    sCommandsInterfaces[i], sPhoneNotifier, i);

    } else if (phoneType == PhoneConstants.PHONE_TYPE_CDMA) {

    phone = new CDMALTEPhone(context,

    sCommandsInterfaces[i], sPhoneNotifier, i);

    }

    Rlog.i(LOG_TAG, "Creating Phone with type = " + phoneType + " sub = " + i);

    sProxyPhones[i] = new PhoneProxy(phone);

    }

    …}

    GSMPhone (Context context, CommandsInterface ci, PhoneNotifier notifier, boolean unitTestMode) {

    super("GSM", notifier, context, ci, unitTestMode);

    mCi.setPhoneType(PhoneConstants.PHONE_TYPE_GSM);

    }

    protected PhoneBase(String name, PhoneNotifier notifier, Context context, CommandsInterface ci,

    boolean unitTestMode, int phoneId) {

    mCi = ci;

    }

    RIL.dial实现如下,封装一个RIL_REQUEST_DIAL类型的消息发送出去,将拨号请求发送给RILD,

    如果是高通平台,RILD会通过QCRIL,以及QMI,和modem进行通信,完成呼叫起呼过程;如果是MTK平台,RILD使用AT指令向modem发送呼叫请求。

    对于RILD之后的处理我们暂不进行分析了。(AT\QMI及modem这部分是feature phone很常规的呼叫流程过程,不是android特色的代码。)

    public void

    dial(String address, int clirMode, UUSInfo uusInfo, Message result) {

    RILRequest rr = RILRequest.obtain(RIL_REQUEST_DIAL, result);

    rr.mp.writeString(address);

    rr.mp.writeInt(clirMode);

    rr.mp.writeInt(0); // UUS information is absent

    if (uusInfo == null) {

    rr.mp.writeInt(0); // UUS information is absent

    } else {

    rr.mp.writeInt(1); // UUS information is present

    rr.mp.writeInt(uusInfo.getType());

    rr.mp.writeInt(uusInfo.getDcs());

    rr.mp.writeByteArray(uusInfo.getUserData());

    }

    send(rr);

    }

    在GsmCallTracker的dial方法中,MTK平台还封装了一个事件为EVENT_DIAL_CALL_RESULT消息,但RIL层响应拨号请求后,被自身的handler处理。(clearDisconnected()和canDial()清空过去的非连接状态的Connections,然后检查是否可以拨打电话。接着检查foregroundCall是否处于Active状态,若是则调用switchWaitingOrHoldingAndActive将它们切换到后台,调用fakeHoldForegroundBeforeDial将前台中的连接全部切换到后台,并且状态变为HOLDING。在进行这些前期检查和准备后,创建一个GsmConnection实例即pendingMO,检查传递过来的电话号码是否有效合法,若不合法则调用pollCallsWhenSafe(),目的是将其标为dropped;若合法则设置为非静音后,调用RIL.dial进行拨号。最后,更新Phone状态并通知给注册者。)

    展开全文
  • SIP用户呼叫流程分析

    2016-06-12 15:58:47
    SIP用户呼叫流程分析文件:
  • 调用流序列生成器是awk和shell脚本的集合,这些脚本将获取一个数据包捕获文件,该文件可以由wirehark读取并生成时间序列。 这对于查看和调试SIP呼叫流或其他网络流量很有用
  • 这是理解WCDMA呼叫流程很好的教程,教程中结合流程图做了很详细的讲解,是中兴内部教材。
  • VOLTE呼叫流程

    千次阅读 2019-07-23 08:45:01
    1 VoLTE用户呼叫VoLTE用户,主被叫均在LTE 1、主叫用户UE(O)的呼叫请求发送到主叫SBC。呼叫请求中包含precondition相关参数,其中主叫侧和被叫侧均为none。 2、主叫SBC向PCC申请通话资源(临时),同时请求主叫...
  • SIP呼叫流程典型流程图解

    千次阅读 2017-11-24 10:05:13
    1.注册流程:… 12.注销流程:… 33. 基本呼叫建立过程:… 44. 会话更改流程:… 55....无应答呼叫前转流程:… 1311.呼叫保持:… 1512.呼叫等等:… 16 1.注册流程: 2.注销流程: 3. 基本呼叫建立过程
  • freeswitch呼叫流程分析

    千次阅读 2018-05-17 17:42:21
    freeswitch呼叫流程分析本文转载自http://www.cnblogs.com/MikeZhang/p/freeswitchCallFlow_20160907.html今天翻文档时发现之前整理的关于freeswitch呼叫相关的内容,写成博文分享出来也方便我以后查阅。整体结构...
  • SIP基本呼叫流程

    千次阅读 2016-09-13 15:04:16
    显示了一个SIP会话的基本呼叫流程。 下面给出的是上述呼叫流程的一步一步的解释: 被发送到代理服务器的INVITE请求负责发起会话。 代理服务器发送100立即给调用者(Alice)试图响应停止重传的INVITE...
  • sip协议呼叫流程详解

    万次阅读 2016-07-23 22:38:14
    sip协议呼叫流程详解
  • H248基本呼叫流程解释

    2008-09-11 12:04:07
    从网上找到的关于H248基本呼叫流程解释的资料
  • Android 5.0 呼叫流程--呼出

    千次阅读 2014-12-01 22:30:45
    我们先给出MO起呼过程的示例流程图,然后结合该图做代码流程的分析: 5.1.1 拨号请求(CallActivity) 我们从CallActivity来开始看MO呼叫流程,在他的processIntent里处理收到的呼叫intent,目前支持3种类型的起呼...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 16,264
精华内容 6,505
关键字:

呼叫流程图