admin管理员组

文章数量:1664593

      Conference Call在项目中的场景不是很多,在日常生活应用也不是很多,基本上项目上的需求原生的代码已经足够。我所接触的只是之前在一个STK 运营商项目上时,对Conference call 有很多UI & 功能的要求,所以趁此也做一个总结,本篇主要是对于IMS的情况做个总结。

1.Conference call 基本介绍

    Conference call 就是常说的电话会议,简单的说就是多台设备同时参与某一路通话(假设为A,B,C三台设备),不是常见的两方对话。详细的解释可以查看:https://en.wikipedia/wiki/Conference_call. 在多方的参与者中,有一方作为host(A),它是这通呼叫的发起方,可以manager这路conference call(与运营商相关). 其他的参与者(B,C)则叫peercall,这两个参与者没有操作这路conference call的能力。 

    Conference call 业务是依赖与运营商的,有些运营商是不支持conference call的,在国内暂时只有CMCC支持conference call。发起Conference call有两种方式:1.将两通call merge成conference。这种方式是最为常见的,A拨打一通电话给B,等B接通后,A再拨打一通电话给C,C再接通后,A就可以将这两通电话merge成一通。2.直接拨打conference。这种方式比较少见,应该是只有在ims的情况下才支持(此处不是很确定,在非IMS的情况下我没有见过能够直接拨打conference。A直接输入B&C的号码直接发起conference call.

     在非IMS Conference call 最多包含6个参与者(包括host),当增加到6方通话后,则不允许继续添加参与者了,但是IMS conference 就没有限制。在GSM情况下,几个参与者组成了一通conference call,host 可以管理这路电话,可以将某个参与者踢出(split)这通conference call. 但是在CDMA情况下,host就没有这个能力了。在注册了IMS的情况下,拨打了一个conference call后(A,B,C),会创建一个conference room,然后A,B,C会依次加入这个conferece room中。在A,B,C均加入这个conference room后,及时非host主动挂断电话(C挂断,AB仍然在通过中),此时AB的通话仍然是conference call.

   Conference call成功后,peer call端(B,C)会在InCallUI上显示host(A)的号码,但是在A端只会显示"Conference call"而不会显示B&C的号码。如果有些运营商有特殊要求(SKT),则可以通过解析sip消息来获取B&C的号码。

2.Conference call 命令下发

   对于conference call,常见的发起方式就是第一种:将两通call merge成conference。下面主要也是解释该流程。Conference call 发起主要可以看作两步:发起两通call & merge两通call.

  • 发起两通call

发起两通call的流程,没有特殊的流程,不管是MO或是MT都是可以的。只要A有两通电话就可以了。我本地的做的测试时发起的两通MOcall。这步没有什么特殊的地方,主要的log逻辑如下:


对于A来说现在已经有了两通MO call了,其中一通call为holding,另外一通为active.

  • merge两通call

    如果A手机的simcard开通了conference call的业务,那么在InCallUI上就会有merge的button.点击这个merge button,就可以将这两通单独的call merge成conference。

   点击mergebutton,CallButtonPresenter.java# mergeClicked会相应该click事件。

  packages/apps/Dialer/java/com/android/incallui/CallButtonPresenter.java
  @Override
  public void mergeClicked() {
    Logger.get(context)
        .logCallImpression(
            DialerImpression.Type.IN_CALL_MERGE_BUTTON_PRESSED,
            call.getUniqueCallId(),
            call.getTimeAddedMs());
    TelecomAdapter.getInstance().merge(call.getId());
  }

****************************************************************************

本文标签: 以及其他流程CallandroidConference