Ims通话流程分析

news/2024/7/5 3:10:07

Ims 是3GPP提出的概念,全称为IP Multimedia Subsystem(ip多媒体子系统),是为了满足IP多媒体业务的需求,基于PS域的一个子系统。

WCDMA网络从R99版本开始,与2G/2.5G网络相比,最大的变化在于空口技术的改变,空口变化直接造成接入带宽的提高,同时核心网分为CS域和PS域两个部分,CS域(电路域)负责语音业务,PS域(分组域)负责Internet访问业务。
从R4版本开始,CS域从原来的TDM承载变成IP承载,同时引入软交换系统,实现呼叫控制和承载相分离。R4版本由于对PS域和CS域都统一承载在IP网络上,同时由于软交换架构,目前成为WCDMA建网的主要选择。
随着用户需求的不断变化,单纯的语音通信和Internet访问业务已经不能满足需求。3GPP从R5版本开始,在原有的PS域的基础上,引入IMS来提供IP多媒体业务。

WCDMA 即3G网络使用PS域实现internet访问业务,CS域(电路域)负责语音业务,所以我们在3G网络时,打电话时,不能同时上网。4G时PS域和CS域都统一由ip网络承载,即volte高清通话,所以我们在4G时开启了volte,通话时还能同时上网。
如果开启volte,则会通过csfb(电路域落回)技术,在2G\3G进行语音业务。

Android 9 引入了一个名为 ImsService 的新 SystemApi 接口,可以帮助实现IP多媒体子系统。ImsService API 是在 Android 平台与供应商或运营商提供的 IMS 实现之间明确定义的接口。即IMS的具体实现是由供应商或运营商实现。 android提供了相关的系统SystemApi接口。

与普通的CS通话一致,由Dialer拨号应用,到Telecom,TeleService。区别在于,在GsmCdmaPhone#diale()中,判断是否支持ims通话。

public Connection dial(String dialString, @NonNull DialArgs dialArgs,
            Consumer<Phone> chosenPhoneConsumer) throws CallStateException {
        if (!isPhoneTypeGsm() && dialArgs.uusInfo != null) {
            throw new CallStateException("Sending UUS information NOT supported in CDMA!");
        }
     
        String possibleEmergencyNumber = checkForTestEmergencyNumber(dialString);
        // Record if the dialed number was swapped for a test emergency number.
        boolean isDialedNumberSwapped = !TextUtils.equals(dialString, possibleEmergencyNumber);
        if (isDialedNumberSwapped) {
            logi("dialString replaced for possible emergency number: " + dialString + " -> "
                    + possibleEmergencyNumber);
            dialString = possibleEmergencyNumber;
        }
        TelephonyManager tm = mContext.getSystemService(TelephonyManager.class);
        boolean isEmergency = tm.isEmergencyNumber(dialString);
        /** Check if the call is Wireless Priority Service call */
        //检查呼叫是否为无线优先服务呼叫
        boolean isWpsCall = dialString != null ? (dialString.startsWith(PREFIX_WPS)
                || dialString.startsWith(PREFIX_WPS_CLIR_ACTIVATE)
                || dialString.startsWith(PREFIX_WPS_CLIR_DEACTIVATE)) : false;

        ImsPhone.ImsDialArgs.Builder imsDialArgsBuilder;
        imsDialArgsBuilder = ImsPhone.ImsDialArgs.Builder.from(dialArgs)
                                                 .setIsEmergency(isEmergency)
                                                 .setIsWpsCall(isWpsCall);
        mDialArgs = dialArgs = imsDialArgsBuilder.build();

        Phone imsPhone = mImsPhone;

        CarrierConfigManager configManager =
                (CarrierConfigManager) mContext.getSystemService(Context.CARRIER_CONFIG_SERVICE);
        //确定是否通过IMS支持无线优先级服务呼叫。
        boolean allowWpsOverIms = configManager.getConfigForSubId(getSubId())
                .getBoolean(CarrierConfigManager.KEY_SUPPORT_WPS_OVER_IMS_BOOL);
        //确认紧急电话是否使用ims
        boolean useImsForEmergency = isEmergency && useImsForEmergency();

        String dialPart = PhoneNumberUtils.extractNetworkPortionAlt(PhoneNumberUtils.
                stripSeparators(dialString));
        boolean isMmiCode = (dialPart.startsWith("*") || dialPart.startsWith("#"))
                && dialPart.endsWith("#");
        boolean isSuppServiceCode = ImsPhoneMmiCode.isSuppServiceCodes(dialPart, this);
        boolean isPotentialUssdCode = isMmiCode && !isSuppServiceCode;
        boolean useImsForUt = imsPhone != null && imsPhone.isUtEnabled();
        boolean useImsForCall = useImsForCall(dialArgs)
                && (isWpsCall ? allowWpsOverIms : true);


     
        //绕过仅限WiFi的WFC检查这是否是紧急呼叫-如果可能,我们仍应尝试通过移动网拨打。
        if (!isEmergency) {
            Phone.checkWfcWifiOnlyModeBeforeDial(mImsPhone, mPhoneId, mContext);
        }
        if (imsPhone != null && !allowWpsOverIms && !useImsForCall && isWpsCall
                && imsPhone.getCallTracker() instanceof ImsPhoneCallTracker) {
            logi("WPS call placed over CS; disconnecting all IMS calls..");
            ImsPhoneCallTracker tracker = (ImsPhoneCallTracker) imsPhone.getCallTracker();
            tracker.hangupAllConnections();
        }
		//是否使用IMS拨打电话
        if ((useImsForCall && (!isMmiCode || isPotentialUssdCode))
                || (isMmiCode && useImsForUt)
                || useImsForEmergency) {
            try {
                chosenPhoneConsumer.accept(imsPhone);
                //imsPhone.dial
                return imsPhone.dial(dialString, dialArgs);
            } catch (CallStateException e) {
            	...
            }
        }
        ...
  }

在这里插入图片描述
Android只提供到ImsCallSession,后面的ImsCallSessionImpl具体实现则要供应商或运营商提供,即imsService的具体实现由供应商或运营商提供。


http://lihuaxi.xjx100.cn/news/3632.html

相关文章

[项目管理-27]:任务的目的,背后的原因是任务实施首要思考的问题。

案例 无论是一个项目&#xff0c;还是一项任务&#xff0c;在实施之前&#xff0c;弄清楚原因&#xff0c;是项目经理必须有的思维模式&#xff0c;而不是无条件的盲目的执行。只有弄清楚目的和原因&#xff0c;才能在执行过程中&#xff0c;遇到问题时&#xff0c;发挥主观能…

Framework之ViewPager2原理与使用

布局管理器允许左右翻转带数据的页面&#xff0c;你想要显示的视图可以通过实现PagerAdapter来显示。这个类其实是在早期设计和开发的&#xff0c;它的API在后面的更新之中可能会被改变&#xff0c;当它们在新版本之中编译的时候可能还会改变源码。 ViewPager经常用来连接Fragm…

【nowcoder】统计回文、连续最大和

统计回文 统计回文 判断回文&#xff1a; 写一个判断是否回文的函数&#xff0c;每次调用函数判断将字符串逆置&#xff0c;如果逆置完和之前是一样的&#xff0c;就是回文的 思路&#xff1a; 找到合适的位置进行插入 判断回文 不要在str1里插入&#xff0c;这样会使str…

从0到1搭建大数据平台之数据计算

文章目录前言一、传统的数据计算二、Hadoop的崛起三、离线计算MapReduceHiveSparkSQL四、 实时计算Spark StreamingFlink总结前言 大家好&#xff0c;我是脚丫先生 (o^^o) 之前有说过「从0到1搭建大数据平台之数据存储」&#xff0c;想必小伙伴还有印象。 既然大数据平台有了…

【JavaWeb】JSP学习笔记

文章目录1 JSP1.1 什么是JSP1.1.1 JSP的发展历程1.2 JSP的快速入门1.2.1 引入依赖1.2.2 创建jsp文件1.2.3 编写JSP代码1.3 JSP脚本(很少用)1.3.1 JSP脚本的作用1.3.2 JSP脚本的分类1.3.3 JSP脚本的截断1.4 JSP的缺点2 EL和JSTL2.1 EL2.1.1 什么是EL2.1.2 Java Web 四大域对象2.…

Java筑基32-IO流02-节点流处理流

目录 节点流和处理流 1.处理流设计模式 2. IO流设计模式-装饰器模式模拟 3. BufferedReader & BufferedWriter 4. Buffered拷贝&#xff08;字符文件&#xff09; 5. Buffered字节处理流 6.Buffered拷贝&#xff08;字节文件&#xff09; 7.对象处理流 8.标准输入输…

ELK8.4安装配置错误记录

1. kibana启动报错&#xff0c;kibana_system用户认证 [2022-09-06T19:47:01.491-04:00][ERROR][elasticsearch-service] Unable to retrieve version information from Elasticsearch nodes. security_exception: [security_exception] Reason: unable to authenticate user …

9.13服务器技术第一次课记录

文章目录1.了解知识结构2. 认识服务器&#xff0c;什么是 服务器——高性能计算机3. 硬件构成和软件系统4. Linux操作系统优势5. 服务器与普通电脑的区别&#xff1f;6.服务器的分类&#xff08;功能 架构 外形&#xff09;架构分类&#xff1a;X86 架构 RISC 架构 EPIC架构外形…