Android5.0之后的版本,手机的CallSetting设置一般在package/apps/service/Telephony中

下面为呼叫转移流程图,包括应用层与RIL的request

1.CallFeartureSettingActivity.java为通话设置入口

//在谷歌的源码中没有这个类,可以直接看2、CallFeatureSetting

在onResume方法中判断手机是单卡还是双卡

单卡直接通过CallFeatureSetting进入补充业务的设置界面,双卡先进入PhoneAccountSettingActivity的双卡选择界面,再通过PhoneAccountSettingFragmentNew选择某个sim卡,以intent进入CallFeatureSetting的activity

2.CallFeatureSetting设置补充业务

CallFeatureSetting中的onResume中调用init,

       if (carrierConfig.getBoolean(CarrierConfigManager.KEY_WORLD_PHONE_BOOL)) {cdmaOptions.setIntent(mSubscriptionInfoHelper.getIntent(CdmaCallOptions.class));gsmOptions.setIntent(mSubscriptionInfoHelper.getIntent(GsmUmtsCallOptions.class));} else {prefSet.removePreference(cdmaOptions);prefSet.removePreference(gsmOptions);int phoneType = mPhone.getPhoneType();if (carrierConfig.getBoolean(CarrierConfigManager.KEY_HIDE_CARRIER_NETWORK_SETTINGS_BOOL)) {prefSet.removePreference(fdnButton);} else {if (phoneType == PhoneConstants.PHONE_TYPE_CDMA) {prefSet.removePreference(fdnButton);//固定拨号if (!carrierConfig.getBoolean(CarrierConfigManager.KEY_VOICE_PRIVACY_DISABLE_UI_BOOL)) {addPreferencesFromResource(R.xml.cdma_call_privacy);}} else if (phoneType == PhoneConstants.PHONE_TYPE_GSM) {if (carrierConfig.getBoolean(CarrierConfigManager.KEY_ADDITIONAL_CALL_SETTING_BOOL)) {addPreferencesFromResource(R.xml.gsm_umts_call_options);GsmUmtsCallOptions.init(prefSet, mSubscriptionInfoHelper);}} else {throw new IllegalStateException("Unexpected phone type: " + phoneType);}}

GsmUmtsCallOption.init(PreferenceScreen,SubscriptionIfoHelper)为补充业务的preference建立对应的intent

63    public static void init(PreferenceScreen prefScreen, SubscriptionInfoHelper subInfoHelper) {
64        Preference callForwardingPref = prefScreen.findPreference(CALL_FORWARDING_KEY);
65        callForwardingPref.setIntent(subInfoHelper.getIntent(GsmUmtsCallForwardOptions.class));
66
67        Preference additionalGsmSettingsPref =
68                prefScreen.findPreference(ADDITIONAL_GSM_SETTINGS_KEY);
69        additionalGsmSettingsPref.setIntent(
70                subInfoHelper.getIntent(GsmUmtsAdditionalCallOptions.class));

不同的补充业务会转入不同的activity,呼叫转移业务对应的activity为GsmUmtsCallForwardOption。

3. GsmUmtsCallForwardOption呼叫转移的activity

在onResume中进行界面初始化,调用init函数,

    @Overridepublic void onResume() {super.onResume();if (mFirstResume) {if (mIcicle == null) {if (DBG) Log.d(LOG_TAG, "start to init ");mPreferences.get(mInitIndex).init(this, false, mPhone);} else {mInitIndex = mPreferences.size();for (CallForwardEditPreference pref : mPreferences) {Bundle bundle = mIcicle.getParcelable(pref.getKey());pref.setToggled(bundle.getBoolean(KEY_TOGGLE));CallForwardInfo cf = new CallForwardInfo();cf.number = bundle.getString(KEY_NUMBER);cf.status = bundle.getInt(KEY_STATUS);pref.handleCallForwardResult(cf);pref.init(this, true, mPhone);}}mFirstResume = false;mIcicle = null;}}

在初次进入时会进行四种呼叫转移的初始化,因为四个呼叫转移都是CallForwardEditPreference类,所以具体每个Preference的点击动作应该看CallForwardEditPreference类;CallForwardEditPreference通过Myhandle的消息处理handleMessage,分别为handleGetCFResponse(设置新CF)与handleSetCFResponse (读取CF状态)。

CallForwardEditPreference分为始终转接,占线时转接,无人接听时转接和无法接听时转接四种情况,也就是四个CallForwardEditPreference,其中init函数是获取当前呼叫转移设置的代码。

    void init(TimeConsumingPreferenceListener listener, boolean skipReading, Phone phone) {mPhone = phone;mTcpListener = listener;if (!skipReading) {mPhone.getCallForwardingOption(reason,mHandler.obtainMessage(MyHandler.MESSAGE_GET_CF,// unused in this caseCommandsInterface.CF_ACTION_DISABLE,MyHandler.MESSAGE_GET_CF, null));if (mTcpListener != null) {mTcpListener.onStarted(this, true);}}}

4. GsmCdmaPhone

其中函数getCallForwardingOption这是个phone的接口方法,继承自接口PhoneInternalInterface

作为父类,真正的实现代码在GsmCdmaPhone.java上

    @Overridepublic void getCallForwardingOption(int commandInterfaceCFReason, Message onComplete) {if (isPhoneTypeGsm()) {Phone imsPhone = mImsPhone;
//判断是否为imsPhone,是的话走ImsPhone(PS)流程,不是的话走CS流程if ((imsPhone != null)&& ((imsPhone.getServiceState().getState() == ServiceState.STATE_IN_SERVICE)|| imsPhone.isUtEnabled())) {imsPhone.getCallForwardingOption(commandInterfaceCFReason, onComplete);return;}if (isValidCommandInterfaceCFReason(commandInterfaceCFReason)) {if (DBG) logd("requesting call forwarding query.");Message resp;if (commandInterfaceCFReason == CF_REASON_UNCONDITIONAL) {resp = obtainMessage(EVENT_GET_CALL_FORWARD_DONE, onComplete);} else {resp = onComplete;}mCi.queryCallForwardStatus(commandInterfaceCFReason, 0, null, resp);}} else {loge("getCallForwardingOption: not possible in CDMA");}}

首先分析走CS流程,mCi为Phone类中的CommandsInterface接口,而CommandsInterface的接口方法都在RIL类中实现

5.RIL

调用函数RIL.queryCallForwardStatus(int cfReason, int serviceClass, String number, Message response)

@Overridepublic void queryCallForwardStatus(int cfReason, int serviceClass,String number, Message result) {IRadio radioProxy = getRadioProxy(result);
//将消息result包装为IRadio发送request到modemif (radioProxy != null) {RILRequest rr = obtainRequest(RIL_REQUEST_QUERY_CALL_FORWARD_STATUS, result,mRILDefaultWorkSource);if (RILJ_LOGD) {riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)+ " cfreason = " + cfReason + " serviceClass = " + serviceClass);}android.hardware.radio.V1_0.CallForwardInfo cfInfo =new android.hardware.radio.V1_0.CallForwardInfo();cfInfo.reason = cfReason;cfInfo.serviceClass = serviceClass;cfInfo.toa = PhoneNumberUtils.toaFromString(number);cfInfo.number = convertNullToEmptyString(number);cfInfo.timeSeconds = 0;try {radioProxy.getCallForwardStatus(rr.mSerial, cfInfo);} catch (RemoteException | RuntimeException e) {handleRadioProxyExceptionForRR(rr, "queryCallForwardStatus", e);}}}

IRadio为c++程序,这是发送Requst的过程,下面就超出了本组的学习内容

呼叫转移流程分析(一)相关推荐

  1. 第五章--第八章 因果图 正交试验表 状态转移 流程分析

    1.因果图 鱼骨图 输入与输入关系:异.或.唯一.要求 输入与输出关系:恒等.非.与.或 2.正交试验表 因子:所有参与试验的影响试验结果的条件称为因子 水平:影响试验因子的取值或输入称为水平 整齐可 ...

  2. Freeswitch配置呼叫转移

    本文章中的呼叫转移流程或者逻辑如下: A呼叫B,由于B忙导致拒接或者不接,超时之后,自动转入对C的呼叫,如果C接通,则A->C通话;如果不接或者拒接,则整个呼叫完毕. 在FS中这个叫顺振!!! ...

  3. freeswitch呼叫流程分析

    今天翻文档时发现之前整理的关于freeswitch呼叫相关的内容,写成博文分享出来也方便我以后查阅. 整体结构图 FreeswitchCore 模块加载过程 freeswitch主程序初始化时会从mo ...

  4. 高通语音专题--呼叫保持流程和日志分析

    1  呼叫保持整体流程 以下是呼叫保持的整体流程图  前提条件:UE1 和 UE2 已经建立正常通话 2  呼叫保持流程及 log 分析 1  UI 向 QMI 发送 Hold  Call 请求 关键 ...

  5. SIP用户呼叫流程分析

    SIP用户呼叫流程 分析文件:

  6. HDFS2.x之RPC流程分析

    HDFS2.x之RPC流程分析 1 概述 Hadoop提供了一个统一的RPC机制来处理client-namenode, namenode-dataname,client-dataname之间的通信.R ...

  7. L2TP协议笔记1---L2TP概念及协议流程分析

    这个协议是早前做防火墙测试工作时主要负责测试的协议,虽然只做了几个月,但感觉如果把当时的一些学习笔记和经验整理好放在网络中,不仅可以使自己的协议理解得到巩固,也让自己有机会在和别人交流中互相学习.   ...

  8. VoLTE技术(含IMS注册/去注册流程、IMS呼叫流程、呼叫保持流程、二次协商过程)

    文章目录 VoLTE技术 IMS简介 SIP消息结构 IMS注册流程 IMS去注册流程 什么是Ghost Call 预留资源的呼叫流程 挂断电话流程(主动挂断.拒接) SDP协议,二次协商过程 呼叫保 ...

  9. Android系统开机到Launcher启动流程分析

    本文基于Android10.0的源码. 由于google团队在对framework层代码进行大量重构,所以代码变动还是挺大的. 常见基础问题: SystemServer系统服务进程是如何创建的?Lau ...

  10. Linphone android去电增加自定义SIP消息头的流程分析

    一.首先看一下如何在发起去电的sip请求中添加自定义的消息头 增加自定义头消息发方法,so已经提供了native方法, 发起呼叫的示例如下: LinphoneCallParams params = l ...

最新文章

  1. html在分页功能中如何实现当前页面的页码样式与其他页面不同_如何使用word文档?word文档使用技巧教程?...
  2. Bootstrap日期插件之Datetimepicker修改默认语言(附带源码)
  3. 实现定时中断_EPIT 定时器,仅需做到如下几步,即可轻松配置使用
  4. 练习_用if语句替换三元运算符
  5. AVFoundation – AVAssetTrack 获取视频 音频信息
  6. android:configchanges的作用,将uiMode附加到android:configChanges实际做什么?
  7. 2021大数据1班《Python程序设计基础》学生学期总结
  8. 86-90linux下配置javaEE环境
  9. html5发光动态效果图,一款带有发光动画的HTML5表单
  10. C语言实现文件类型统计程序,C语言实现文件类型统计函数
  11. 企业全面运营管理沙盘模拟心得_大庆职业学院举办创业技能大赛企业经营管理沙盘模拟赛...
  12. 学习用于视觉跟踪的深度紧凑图像表示Learning a Deep Compact Image Representation for Visual Tracking
  13. 【Android-File】Android文件的读写
  14. android系统版本命名,安卓历代系统版本命名回顾 你吃过哪些甜点?
  15. 教程篇(6.0) 01. FortiGate及其Security Fabric介绍 ❀ FortiGate 安全 ❀ Fortinet 网络安全专家 NSE 4
  16. 数字藏品交易平台开发 数字藏品交易网站开发
  17. STM8读取AD值偶尔跳变出错的问题
  18. 已解决AttributeError: module ‘tkinter‘ has no attribute ‘TK
  19. CSDN专栏达人如何获得(看不懂我倒立吃。。。)
  20. 论文画图工具:25个常用Matplotlib图的Python代码总结

热门文章

  1. wifi微信连不到服务器,微信连不上wifi怎么办?
  2. 计算机占cpu程序,电脑cpu占用过高怎么办 电脑进程CPU占用100%解决办法
  3. 含耦合电感元件的电路分析
  4. 软件测试---组织架构图和范围测试列表
  5. react todos 简单实现
  6. 极速办公ppt里面如何插入表格
  7. Ingenuous Cubrency UVA - 11137(完全背包)
  8. 【Photoshop 教程系列第 1 篇】如何用 PS 给图片添加文字,修改文字的字体,大小和颜色
  9. HTTP协议请求头部的User-Agen和Cookie
  10. 【图像修复】论文阅读笔记 ----- 《Image inpainting based on deep learning: A review》