拨号时序图:
总体分为四个部分:Dialer,PhoneCommon,TeleService,Telephony Framework。分别对应packages/apps/Dialer、packages/apps/PhoneCommon、packages/services/TeleService、framework/opt/telephony。实际上拨号操作会调用到RIL并使用AT指令发送给Modem,最终Modem与硬件交互后向基站发起通话请求。
拨号入口Dialer:
拨号预处理PhoneCommon
通过Dialer拨号我们可以知道,在Dialer的ContactsCallOptionHandler类中,调用doCallOptionHandle方法开启Phone的入口。
整个拨号预处理过程分为10个阶段,分别为:
1. FirstCallOptionHandler
开始拨号预处理,判断呼叫号码是否属于voicemail,如果是则对intent进行一些处理,添加simId字段;
2. EmergencyCallOptionHandler
判断呼叫号码是否为紧急号码,如果是紧急号码则不再进行后续判断而直接开始拨号操作(跳转到OutgoingCallReceiver);
3. InternetCallOptionHandler
判断当前呼叫号码是否为网络拨号,即SIP Phone;
4. VideoCallOptionHandler
判断当前是否是进行的视屏拨号,即Video Call;
5. SimSelectionCallOptionHandler
判断当前使用哪一张SIM卡进行拨号。这一步会根据用户设置的默认SIM卡进行拨号,默认是弹出对话框,用户选择其中一张SIM卡进行拨号;
6. SimStatusCallOptionHandler
判断当前SIM卡状态是否允许拨号操作;
7. VoiceMailCallOptionHandler
判断当前呼叫号码是否属于voicemail,如果是则进行相关处理;
8. InternationalCallOptionHandler
判断呼叫号码是否符合当前国家ISO码;
9. IpCallOptionHandler
判断当前呼叫号码是否是IP呼叫(加拨17951);
10. FinalCallOptionHandler
会到Dialer中的ContactsCallOptionHandler中;
以上就是拨号的号码预处理流程,这个预处理流程时序图如下:
TeleService服务处理
在TeleService中还是会进行各种判断,这些判断有的是在PhoneCommon中做过的,但这是Android原生流程,MTK并没有去修改。比如期间还是有SIP Call和Emergency Call的判断。经过前面的PhoneCommon之后,会使用以下方式发出广播:
public void onContinueCallProcess(Intent intent) {
//清楚PhoneCommon过程中产生的dialog
dismissDialogs();
/** @} */
intent.setAction(Constants.OUTGOING_CALL_RECEIVER);
intent.setClassName(Constants.PHONE_PACKAGE, Constants.OUTGOING_CALL_RECEIVER);
DialerApplication.getInstance().sendBroadcast(intent);
}
TeleService中Call处理部分,实际上主要是后台逻辑处理,Android 4.4 Phone最重要的特点就是将显示和逻辑分离。这块与Android 4.2改动并不大,只是从原来的Phone中分离了出来。
TeleService执行时序图如下:
Framework Telephony处理拨号请求
这里的调用和参数传递也比较多,有几个关键点需要提一下。当我们跳转到CallManager的dial方法后,会执行到以下代码获取Connection:
result = basePhone.dial(dialString);
basePhone是Phone对象,而Phone是一个接口类,而且这里是通过参数传递过来的。我们在CallController的placeCallInternal()方法中可以看到以下代码:
phone = PhoneUtils.pickPhoneBasedOnNumber(mCM, scheme, number, sipPhoneUri);
继续查看pickPhoneBasedOnNumber方法:
public static Phone pickPhoneBasedOnNumber(CallManager cm,
String scheme, String number, String primarySipUri) {
if (primarySipUri != null) {
Phone phone = getSipPhoneFromUri(cm, primarySipUri);
if (phone != null) return phone;
}
return CallManagerWrapper.getDefaultPhone();//不是SIP Call
}
继续查看CallManagerWrapper中的getDefaultPhone方法:
public static Phone getDefaultPhone() {
Phone phone = null;
if (GeminiUtils.isGeminiSupport()) {//是否支持双卡
phone = ((GeminiPhone) MTKCallManager.getInstance().getDefaultPhoneGemini());
} else {
phone = CallManager.getInstance().getDefaultPhone();
}
return phone;
}
因为这里是MTK GSM/WCDMA制式的手机,因此是支持双SIM卡的。双SIM卡支持是Android原生没有的,MTK自己做了这一块,但却把相关方法实现封装到了jar包中。
回过头来,我们终于找到了
result = basePhone.dial(dialString);
中的basePhone,实际应为GSMPhone自然继续跳转拨号。后续流程就是通过framework通知到RIL层,RIL层再使用AT指令发送到modem端最终完成拨号动作。
整个时序图如下:
总结
整个MO流程看起来很复杂,但我们可以简单的归结为四个步骤:
1. 拨号处理;
2. 号码预处理;
3. TeleService后台处理;
4. framework telephony处理;
分享到:
相关推荐
Android 4.4 设置壁纸流程,包括静态壁纸以及动态壁纸的设置流程图 思维导图
文章:《Android 4.4 Kitkat Phone工作流程浅析(七)__来电(MT)响铃流程》中涉及的时序图 http://blog.csdn.net/yihongyuelan/article/details/24640819
Android4.4+短信拦截删除,Android4.4或者更高版本短信拦截与删除。本人在Android4.4.4红米上测试通过
android4.4 app触摸校准
文章《Android 4.4 Kitkat Phone工作流程浅析(三)__MO(去电)流程分析》资源下载 http://blog.csdn.net/yihongyuelan/article/details/21069061 主要包含: MTK Android 4.4 拨号时序图(多张) MTK Android 4.4 ...
Android 4.4 SDK Reference 的官方帮助文档
demo 主要功能是接收短信,支持android 4.4以上版本和android 4.4以下版本。在写代码时也在网上找了好多类似的代码,但是没有找到一个完整的适合新手学习的,都是一些只支持android4.4以下的android系统应用demo,...
Android 4.4 SDK 文档
android 4.4 源码 eclipse 浏览
Android 4.4 SDK Reference.chm
该资源对在Android4.4下与BLE设备通信的过程进行了具体详细的描述。实现了Android使用蓝牙4进行远程点灯的功能。代码基于google提供的BloodPressure的DemoApp基础上进行修改。采用后台服务访问设备,前台进程更新...
基于Android4.4Contacts源码,不可独立运行
android4.4 源码,解压可得。可用于eclipse导入源码,方便在用eclipse开发过程中,阅读源码。也可以解压后,在文件目录下打开源码文件阅读代码。
在android4.4 平台,给预安装apk进行静默安装升级待命示例
android 4.4 源生 播放器源代码
一个android4.4WebVeiw文件上传小例子(无源码)
这是用git在官网上下载的android4.4的core源代码,在eclipse上加入进去,编程的同时就能看Android的代码了。
android4.4上原生的launcher3代码
android4.4源代码下载,方便大家在eclipse中查看源码,关联到自己的项目中
Ubuntu 12.04搭建环境成功编译过android4.4的源码。