拨号时序图:
总体分为四个部分: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系统中,用户可以根据个人喜好设置静态壁纸或动态壁纸,为设备增添个性化的视觉体验。本文将详细介绍这两种壁纸的设置流程,并通过思维导图的方式帮助理解每一步的操作步骤。 首先,我们来看静态壁纸...
在使用Vue.js开发的Web应用中,可能会遇到与Android 4.4版本不兼容的问题。考虑到Android 4.4在市场份额中仍占有一定比例,特别是在一些较为老旧的设备或新兴市场中,解决这些兼容性问题是提升用户体验的重要一环。 ...
《深入理解Android 4.4源码:开启技术探索之旅》 Android 4.4,代号KitKat,是Google推出的Android操作系统的一个重要版本。它带来了许多改进和新特性,对于开发者来说,深入理解其源码是提升开发技能、优化应用...
在这个特定的压缩包中,我们找到了适用于Android 4.4版本的VLC源码以及相关的SO(Shared Object)库文件,这对于开发者来说是宝贵的资源,尤其是那些需要在旧版本Android系统上运行VLC或进行自定义开发的人员。...
文章:《Android 4.4 Kitkat Phone工作流程浅析(七)__来电(MT)响铃流程》中涉及的时序图 http://blog.csdn.net/yihongyuelan/article/details/24640819
《深入解析Android 4.4源码:洞察系统运行机制》 Android 4.4,代号KitKat,是Google推出的Android操作系统的一个重要版本。它带来了许多改进和新特性,对于开发者来说,深入理解Android 4.4的源码至关重要,这能...
Android 4.4 SDK(软件开发工具包)是Android开发者为构建、测试和发布针对Android 4.4 KitKat版本应用的重要工具集。这个版本的SDK包含了一系列的文档、库、示例代码、调试工具和其他资源,使得开发者能够充分利用...
《Android 4.4 SDK Reference》是Android开发者的重要参考资料,它详尽地涵盖了在Android 4.4(KitKat)版本中使用的API和技术。这份官方文档对于任何希望深入理解和开发针对此版本Android应用的程序员来说,都是不...
《深入剖析Android 4.4核心源码》 Android 4.4,也被称为KitKat,是Android操作系统的一个重要版本,它带来了许多性能优化和新功能。这份源代码的获取,意味着我们可以直接深入到Android系统的核心,理解其内部运作...
这款“谷歌Chrome浏览器x86版APK低版本Android4.4可用浏览器版本是72.0”是专为使用x86架构设备的用户设计的,如某些平板电脑和安卓模拟器。对于那些在Android 4.4(KitKat)系统上运行的设备,这是一个理想的解决...
在Android 4.4(KitKat)及更高版本中,为了增强用户体验和安全性,系统提供了更高级别的API来处理短信,包括拦截和删除短信。本文将深入探讨Android 4.4+短信拦截删除的相关知识点。 首先,我们要了解的是`...
Android 4.4(KitKat)作为Android系统的一个重要版本,引入了许多新特性和优化。本篇将详细探讨如何使用Eclipse来浏览和分析Android 4.4的源码。 首先,要准备Eclipse IDE,这是Android开发者常用的集成开发环境。...
【Android 4.4 安卓4.4源代码】是Android操作系统的一个重要版本,它在2013年发布,代号为“KitKat”,是Google与巧克力品牌KitKat的合作成果。这个版本的源代码对开发者来说是极其宝贵的资源,因为它提供了Android...
Android 4.4,也被称为KitKat,是Google在2013年推出的Android操作系统版本。这个版本的源代码对于开发者来说是极其重要的,因为它揭示了系统的内部工作原理,允许他们深入理解Android的运行机制,并进行自定义开发...
文章《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系统中,Contacts应用是用户管理联系人的重要组成部分。它不仅负责显示、编辑和组织联系人的信息,还与其他系统服务如Google账户同步、来电显示等功能紧密协作。这里我们将深入探讨Android 4.4 ...
Android 4.4W(API 20)是Android操作系统的一个重要版本,主要针对可穿戴设备进行了优化。这个源码的获取过程可能较为繁琐,感谢分享者提供的努力。通过研究这个版本的源码,开发者可以深入理解Android系统的工作...
Android 4.4 SDK(Software Development Kit)源码包是一个为开发者提供的完整工具集,用于构建、调试和优化在Android 4.4 KitKat版本上运行的应用程序。这个源码包包含了Android操作系统的源代码,使得开发者能够...
在Android 4.4(KitKat)版本中,这个功能主要应用于企业级设备管理和批量部署应用的场景。下面我们将详细探讨如何在Android 4.4上实现APK的静默安装以及相关的知识点。 1. **权限要求**: 在Android 4.4中,静默...
android4.4 app触摸校准