java实现电话的呼叫转移_「呼叫转移设置」呼叫转移流程分析(一) - seo实验室...
呼叫转移设置
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函数,
@Override
public 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 case
commandsInterface.CF_ACTION_DISABLE,
MyHandler.MESSAGE_GET_CF, null));
if (mTcpListener != null) {
mTcpListener.onStarted(this, true);
}
}
}
4. GsmCdmaPhone
其中函数getCallForwardingOption这是个phone的接口方法,继承自接口PhoneInternalInterface
作为父类,真正的实现代码在GsmCdmaPhone.java上
@Override
public 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)
@Override
public void queryCallForwardStatus(int cfReason, int serviceClass,
String number, Message result) {
IRadio radioProxy = getRadioProxy(result);
//将消息result包装为IRadio发送request到modem
if (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的过程,下面就超出了本组的学习内容
相关阅读
用户界面设计
接口设计主要包括三个方面的内容:一是设计软件构件间的接口;二是设计模块和其他非人的信息生产者和消费者(如外部
一、爬取豆瓣影评
基本思路:先获取每个电影的评论区链接,然后依次进入其评论区爬取评论。选取10部电影,每部200条评论。
用到的包为
在同城货运市场不断扩大趋势下,货拉拉作为一款同城货运的APP,如何在市场上占有一席之地的,又存在哪些交互细节的问题,我们一起进入产
2016年中国出生人口数量同比增长11.50%,家庭育儿市场迎来人口红利。同时,伴随着科学养育观念不断渗透,男性在家庭育儿过程中参与度越
唱吧需要怎么利用自己的目前积累的强大体量用户和明星资源,寻找差异化突破点来应对全民K歌?本文作者就此来分析,一起来瞧瞧~一、背景
java实现电话的呼叫转移_「呼叫转移设置」呼叫转移流程分析(一) - seo实验室...相关推荐
- tkinter 设置不可编辑_「input不可编辑」input 不可编辑的方法 - seo实验室
input不可编辑 1.disabled 属性规定应该禁用 input 元素,被禁用的 input 元素,不可编辑,不可复制,不可选择,不能接收焦点,后台也不会接收到传值.设置后文字的颜色会变成灰色. ...
- linux重启用reboot后起不来_「linux重启命令」Linux之重启reboot命令 - seo实验室
linux重启命令 reboot 用来重启linux系统和windows系统中的restart一样.但是机器重启必须要root用户才有权限. 命令语法: /sbin/reboot [-n] [-w] ...
- markdown如何调整行距_「行距怎么设置」【CSS】如何设置行距、段落间距、缩进格式 - seo实验室...
行距怎么设置 在使用MarkDownHere的时候,需要利用CSS编辑各个段落的格式,本文记录了CSS中编辑格式的各个属性及其设置. 行距 行距一般使用line-height: value;来表示,比 ...
- ubuntu 安装mysql 5.5_「ubuntu安装mysql」Ubuntu16.04安装mysql5.5 - seo实验室
ubuntu安装mysql 本文实在网上找的资料的基础上修改的
- mac系统如何进入系统偏好设置_技巧:5 种迅速定位 Mac「系统偏好设置」选项的方法...
Mac 上的「系统偏好设置」就像 Windows 平台的「控制面板」那样,借助它,你可以针对系统的方方面面进行符合你口味的「定制」,如果你是一名 Mac 新手,这里是你个性化 Mac 的好地方. 然而 ...
- javacore分析工具_「赵强老师」如何分析Java的内存溢出问题
一.什么是内存溢出? 内存溢出(OOM:out of memory)通俗理解就是内存不够,通常在运行大型软件或游戏时,软件或游戏所需要的内存远远超出了你主机内安装的内存所承受大小,就叫内存溢出. 在J ...
- python docker自动化_「docker实战篇」python的docker爬虫技术-移动自动化控制工具appium工具(17)...
原创文章,欢迎转载.转载请注明:转载自 IT人故事会,谢谢! 原文链接地址: 「docker实战篇」python的docker爬虫技术-移动自动化控制工具appium工具(17) Appium是一个开 ...
- python程序员面试自我介绍_「日语面试自我介绍」程序员日语自我介绍 - seo实验室...
日语面试自我介绍 初めまして.わたしは胡です.コンピューター関係の専門(せんもん)で卒業し.三年間対日(たいにち)javaの開発と試験の経験(けいけん)を持って.また.先端(せんたん)技術(ぎじゅつ) ...
- java的标量和聚合量_欧尼酱讲JVM(16)——如何基于逃逸分析进行代码优化
代码优化是一个涉及面很广的"工程",但是今天呢,本姑娘主要给大家分享基于逃逸分析,如何给代码做优化.那么逃逸分析是什么呢?我前面的文章也仔细的讲解过了,这里就不过多的赘述了.有不明 ...
- 背景宽高随文本变化_「只要功夫深 不用关键帧」之文本图层小技巧
「只要功夫深 不用关键帧」将不定期更新一些AE表达式和脚本的奇技淫巧,希望能给大家带来一些启发. 上周有朋友遇到这么个问题: 对一段文字,不管文字长度如何变化,想让背景到文字的边距始终保持不变,在 A ...
最新文章
- 再见,Navicat!这个Pycharm的兄弟真香!
- [mybatis]typeHandlers日期类型的处理
- 【Flink】Flink 不支持部分 task 结束后进行 checkpoint
- java的string类_Java中的String类笔记
- 【TCP/IP】TCP的三次握手和四次挥手
- Java 数组转字符串
- mysql发生系统错误5_[玩转MySQL之一]MySQL体系架构简介
- 在手机上实现实时的单目3D重建
- 自动锁定计算机怎么设置,win10如何设置自动锁定屏幕_win10设置自动锁屏的步骤...
- javafx 五、网络请求
- 赞雨林木风:从修改版到定制版
- Install OE and BitBake
- Beyond Compare 4.3.7 使用
- 51信用卡不止于想象力?
- java edt,java并发之EDT测试
- 小节点也能引爆活动!2021四月活动指导方案
- 根据url地址生成二维码,微信扫描二维码可直接打开网址
- python电影推荐算法_基于Python的电影推荐算法
- 使用U盘重装win10系统(微PE)
- ppt流程图字体太小_老板让你用PPT汇报工作?这5个实用小技巧让你的PPT锦上添花!...