java实现电话的呼叫转移_「呼叫转移设置」呼叫转移流程分析(一) - seo实验室...

news/2024/5/20 15:11:28/文章来源:https://blog.csdn.net/weixin_33301143/article/details/114759867

呼叫转移设置

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

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

a8df74a42df4e960f7bcbc8b722b7af0.png

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歌?本文作者就此来分析,一起来瞧瞧~一、背景

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_784705.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

织梦定时更新栏目html,网站栏目添加与维护

1. 网站栏目添加与维护1.1. 网站栏目管理网站栏目管理是网站的核心部分,是网站内容添加的前提条件。网站栏目也是网站首页的导航条,有着引导网站用户的作用。同时他还是网站地图,在后台生成的百度Sitemap中就有相关的栏目内容。网站栏目在网站…

png 微软ppt 透明度_挖到一个宝藏级的PPT素材网站,哭着五星好评,免费又实用...

今天分享一个超级实用的PPT素材网站,有了它,就再也不用去各大图片素材网站上费尽心机的找背景图了。好了,不兜圈子了!直接上网址:Undraw网址:https://undraw.co/illustrations网站上都是一些简约风格的插画…

Google Analytics SEO 实时 网站 访问量 统计

说明: 之前一直在想要怎么才能让aplexos.com域名网站能够统计访问量,网站是使用github.io搭建,不好统计静态网站访问量,想借助工具,但是效果不好,不小心看Google Analytics,然后就注册了…

web漏洞扫描工具_ubuntu linux系统下web网站敏感目录漏洞扫描工具

大家好,今天我们来介绍下:web网站敏感目录漏洞扫描工具一、CansionCansina一款用于发现网站的敏感目录和内容的安全测试工具,通过分析服务器的响应进行探测并使用sqlite保证数据持久性特性多线程HTTP/S 代理支持数据持久性 (sqlite3)多后缀支…

python手机端给电脑端发送数据_手机端网站和pc端网站差别大吗

如今是互联网营销的时代,要做好企业的网络营销,那么企业的网站是一个利器,因为网站不仅可以展示企业的文化、产品,还可以通过在搜索引擎的排名给企业带来流量,让企业网站排名和流量都会增加,现在智能手机越…

多网站情况下配置nginx 301 永久重定向

2019独角兽企业重金招聘Python工程师标准>>> 已经配置成功2个网站在lnmp环境下 修改其中一个网站的301重定向 Step 1: 虚拟主机配置文件 xxx.com.conf 修改成: server_name xxx.com; index index.html index.htm index.php defau…

中关村网站产品参数页的参数纠错的制作

今天突然想在正在做的网站中加上个像中关村一样的参数纠错的功能,效果如下图: 虽然看起来好像蛮简单,但是自己还是想了一下午加上晚上的2个小时,不过等到自己做出来的时候好像也感觉到蛮简单的,其实这种web页面的小特效…

电子商务网站IDC网络拓扑设计

这个拓扑是我为之前公司设计的线上环境的拓扑看着很简单,可是这是我为了让别人看懂而一再精简的,里面把很多实施细节忽略掉了说下要想完成这个拓扑需要的知识储备:至少需要CCNP相当的水平这里面用到了动态路由协议,VLAN划分&#…

查看网站用何种web服务器的命令

查看网站用何种web服务器的命令http://blog.163.com/huv520126/blog/static/2776523920101030104928998/ curl --head xxxxx转载于:https://blog.51cto.com/7499256/1575973

万网免费主机wordpress快速建站教程-wordpress下载及安装

进入wordpress官网(http://cn.wordpress.org)下载最新的wordpress安装程序,下载完成后解压到任意电脑目录。解压完毕后,使用FTP管理工具上传安装文件至主机htdocs目录。这里使用的是FlashFXP。首先点击连接按钮,填上FT…

访问网站出现图片破裂

访问网站出现图片破裂访问网站的时候出现图片破裂现象本人排查思路如下几点:1、刚开始去查看图片属性登陆服务器查看图片都存在,而且权限都有,但是图片还是不行.2、接着换浏览器测试问题依旧.3、找朋友在别的地方测试都ok.4、最终确定是本地办公网络的原因,主要是网络延迟大,传…

75佳非常漂亮的 CSS 网站布局欣赏(系列五)

互联网高速发展中,每天都有成千上万的新网站诞生。最早的网站是没有样式的,后来引入了 CSS 用来格式化结构化的网页内容,用于精确的控制网页的布局和外观。然而因为浏览器兼容性问题,要使用 CSS 制作出高质量的网站不容易。今天开…

[导入]探讨高访问量网站优化方案(从图片角度)

摘要: 我们知道现在一个好的网站都面临着访问量的问题.高访问量的网站服务器的压力大概来自以下两个方面: 第一:数据库,大量的数据查询操作必定会消耗大部分时间. 第二:WEB服务器本身,大量的图片以及js文件的加载 . 这里我针对第二项说下大多网站在这方面可能进行的优化操作.个…

百度单方面修改网站url导致大量404

2019独角兽企业重金招聘Python工程师标准>>> 百度抓取到的内容,用户搜索并访问后,百度改写了url(域名之后的第二个目录),导致出现大量的404,交涉无果,没办法,只能自己修复…

网站安装打包 webconfig修改[三]

在net中,在System.Configuration.ConfigurationManager中,提供了几个静态方法,用来修改配置文件。 如:System.Configuration.Configuration config System.Configuration.ConfigurationManager.OpenMachineConfiguration(); 获得应用程序下的…

学用MVC4做网站一:修改密码1.4

一、用户 1.1用户注册 1.2用户登录 1.3修改密码 1.4修改资料 在用户登陆成功后要跳转到一个页面,暂且叫做用户中心吧。在【UserController】添加[default] action [UserAuthorize]public ActionResult Default(){userRsy new UserRepository();var _user userRsy.…

动态网站基础

1. 通信: HTTP, URL, 请求和响应 2. 数据存储: 数据库 3. 表示: 将模板渲染成HTML或其他格式 然后把这3部分组合在一起,即WEB框架。比如Django。 也就是传说中的MVC。这样的好处是 1) 灵活 2) 清晰 3&#…

网站访问过程理解(一点记录)

一个普通网站访问的过程 简单概括一下,对于我们普通的网站访问,涉及到的技术就是:用户操作浏览器访问,浏览器向服务器发出一个 HTTP 请求;服务器接收到 HTTP 请求,Web Server 进行相应的初步处理&#xff0…

大型网站技术架构(六)网站的伸缩性架构

2019独角兽企业重金招聘Python工程师标准>>> 网站系统的伸缩性架构最重要的技术手段就是使用服务器集群功能,通过不断地向集群中添加服务器来增强整个集群的处理能力。“伸”即网站的规模和服务器的规模总是在不断扩大。 1、网站架构的伸缩性设计 网站的…

seo从入门到精通_SEM必读书单丨从入门到精通,这9本书就是你的钥匙!

也许你刚进入SEM行业没多久也许你已经在SEM领域混迹多年你有没有注意过自己已经很久很久没有获取新鲜的知识了?其实很多你工作中的烦恼和误区在书里都能得到解答下面,我为大家介绍9本书,建议先看书时,可以先看完每一个小节后&…