打电话流程

接下来分析一下打电话的流程。输入电话号码的流程这里忽略。输入电话号码之后会点击拨打图标。之后就会走拨打电话的流程了。这部分是在packages/apps/Dialer/src/com/android/dialer/DialtactsActivity.java中实现的。
下面分析源码分析

    public void onClick(View view) {switch (view.getId()) {case R.id.floating_action_button:if (mListsFragment.getCurrentTabIndex()== ListsFragment.TAB_INDEX_ALL_CONTACTS && !mInRegularSearch) {DialerUtils.startActivityWithErrorToast(this,IntentUtil.getNewContactIntent(),R.string.add_contact_not_available);} else if (!mIsDialpadShown) {mInCallDialpadUp = false;showDialpadFragment(true);mFloatingActionButton.setImageResource(R.drawable.fab_ic_call);mFloatingActionButton.setVisibility(view.VISIBLE);setConferenceDialButtonImage(false);setConferenceDialButtonVisibility(true);} else {//用户点击拨打键mDialpadFragment.dialButtonPressed();}break;}}

上面就是click之后将会调用packages/apps/Dialer/src/com/android/dialer/dialpad/DialpadFragment.java

public void dialButtonPressed() {getView().performHapticFeedback(HapticFeedbackConstants.VIRTUAL_KEY);//按键反馈
handleDialButtonPressed();
}private void handleDialButtonPressed() {final Intent intent = CallUtil.getCallIntent(number);
if (!isDigitsShown && !PhoneNumberUtils.isEmergencyNumber(number)) {// must be dial conference add extraintent.putExtra(EXTRA_DIAL_CONFERENCE_URI, true);
}intent.putExtra(ADD_PARTICIPANT_KEY, mAddParticipant && isPhoneInUse());DialerUtils.startActivityWithErrorToast(getActivity(), intent);hideAndClearDialpad(false);}

之后就开始启动拨号的Activity
启动Activity代码如下:

packages/apps/Dialer/src/com/android/dialer/util/DialerUtils.javapublic static void startActivityWithErrorToast(Context context, Intent intent, int msgId) {try {if ((IntentUtil.CALL_ACTION.equals(intent.getAction())&& context instanceof Activity)) {final TelecomManager tm =(TelecomManager) context.getSystemService(Context.TELECOM_SERVICE);tm.placeCall(intent.getData(), intent.getExtras());} else {context.startActivity(intent);}} catch (ActivityNotFoundException e) {Toast.makeText(context, msgId, Toast.LENGTH_SHORT).show();}}

这里面有两种拨号的方式:1.直接调用TelecomManager进行呼叫;2,启动一个Activity显示拨号界面。
这里面有一个转换过程:public static final String CALL_ACTION = Intent.ACTION_CALL;
之后拨打电话的流程如下图:

UserCallActivityUserCallIntPrimaryCallReceiverCallIntentProcessorNewOutgoingCallICallsManagerCallCreateConnecConnectionSeConnectionServiceTelephonyConnPhoneCallTrackerRILonCreateprocessIntentsendBroadcastToReceiver with KEY_IS_PRIVILEGED_DIALERonReceiveprocessOutgoingCallIntentprocessIntentprocessIntentplaceOutgoingCallstartCreateConnectionnewprocessattemptNextPhoneAccountcreateConnectionsendmessage(MSG_CREATE_CONNECTION)onCreateOutgoingConnectiononCreateOutgoingConnectionplaceOutgoingConnectiondialdialdialUserCallActivityUserCallIntPrimaryCallReceiverCallIntentProcessorNewOutgoingCallICallsManagerCallCreateConnecConnectionSeConnectionServiceTelephonyConnPhoneCallTrackerRIL

接收来电的处理过程

SubscriptionManager本身就是一个service
registerService(Context.TELEPHONY_SUBSCRIPTION_SERVICE, SubscriptionManager.class,)

PhoneAppTelephonyGlobalsTelecomAccoSubscriptionManagerTelephonyRegistryTelephonyManagernewonCreatesetupOnBootaddOnSubscriptionsChangedListeneraddOnSubscriptionsChangedListenerlistenlistenForSubscriberPhoneAppTelephonyGlobalsTelecomAccoSubscriptionManagerTelephonyRegistryTelephonyManager

之后就开始监听消息。

TelephonyRegistryTelecomAccountRegTelecomAccoAccountEntryPstnIncomingPhonePstnPhoneCapabonSubscriptionsChangedsetupAccountsnewTelephonyConnectionServicenewregistEVENT_NEW_RINGING_CONNECTION EVENT_CDMA_CALL_WAITINGEVENT_UNKNOWN_CONNECTIONnewTelephonyRegistryTelecomAccountRegTelecomAccoAccountEntryPstnIncomingPhonePstnPhoneCapab

当有新的call之后处理

GsmCallTrackerPhoneBasePstnIncomingTelecomManagerTelecomServiceImplCallIntentProcessorCallsManagerCallCreateConnecConnectionSerConnectionSeBinder2ServiceBindTelephonyConnConnectionServicenotifyNewRingingConnectionPhandleNewRingingConnectionaddNewIncomingCalladdNewIncomingCallnew Intent(TelecomManager.ACTION_INCOMING_CALL)processIncomingCallIntentprocessIncomingCallIntentnew CallstartCreateConnectionprocessattemptNextPhoneAccountgetServicenew ConnectionServiceWrappercreateConnectionbindnewbindServiceonServiceConnectedsetServiceInterfaceaddConnectionServiceAdapterMSG_ADD_CONNECTION_SERVICE_ADAPTERGsmCallTrackerPhoneBasePstnIncomingTelecomManagerTelecomServiceImplCallIntentProcessorCallsManagerCallCreateConnecConnectionSerConnectionSeBinder2ServiceBindTelephonyConnConnectionService

这里面需要注意,bind的Service为:TelephonyConnectionService

TelephonyConnConnectionServiceConnectionSeCallMSG_CREATE_CONNECTIONcreateConnectiononCreateUnknownConnectionhandleCreateConnectionCompletehandleCreateConnectionSuccessTelephonyConnConnectionServiceConnectionSeCall

之后就是调用UI注册进来的listener用来更新UI了。

Android Tel 拨打电话及来电流程分析相关推荐

  1. Android 10 拨打电话流程

    接续上一章节,理解Android 10 拨打电话流程 packages/apps/Dialer/java/com/android/dialer/dialpadview/DialpadFragment. ...

  2. Java模拟拨打电话程序_java_编写android拨打电话apk应用实例代码,android 实现拨打电话的app,代 - phpStudy...

    编写android拨打电话apk应用实例代码 android 实现拨打电话的app,代码非常简单,功能也很实用,分享给大家. MainActivity.java package com.bblei.c ...

  3. Android 源码 Camera2 预览流程分析四

    <Android 源码 Camera2 预览流程分析二>中进行了流启动,这是调用 QCamera3Channel start() 方法实现的,对应于 HAL_PIXEL_FORMAT_YC ...

  4. android N 拨打电话流程(MO)

    本流程图基于MTK平台 Android 7.0,拨打的普通电话,本流程只作为沟通学习使用 整体流程图 流程中部分重点知识 packages-apps目录 dialer应用的DialpadFragmen ...

  5. Android N拨打电话的流程

    1. 从Dialer工程开始,DialtactsActivity中打开DialpadFragment界面,在DialpadFragment中实现OnClickListener的onClick()方法, ...

  6. android -- phone (三)来电流程

    上一篇是去电流程,接下来自然是来电流程,按消息的接收顺序,我们关心来电消息最开始是从哪来的,所以先RIL层开始,这里如果有涉及AT命令,均以android源码所使用的AT命令为准(即 3gpp 27. ...

  7. android调用拨号界面拨打电话功能,Android实现拨打电话功能

    添加权限: 实现: package com.example.call_person; import android.annotation.SuppressLint; import android.co ...

  8. Android实现拨打电话

    一.添加拨打电话的权限 <uses-permission android:name="android.permission.CALL_PHONE"/> 二.两种方法 1 ...

  9. android如何拨打电话

    方法一:直接拨打电话,需要添加权限 <uses-permission android:name="android.permission.CALL_PHONE" /> / ...

最新文章

  1. oracle惯用缩写的含义
  2. Cisco IOS版本命名规范
  3. Spring boot 各种入门及问题
  4. ntu 课程笔记 :MAS714(7) 最短路径和优先队列
  5. MySQL非空约束(NOT NULL)
  6. zookeeper结构和命令详解
  7. Word2Vec教程-Skip-Gram模型
  8. MapReduce:详解Shuffle过程
  9. RuntimeError: Legacy autograd function with non-static forward method is deprecated. Please use new-
  10. html css 博客园,分享几个博客园代码样式的CSS配置(复制黏贴即可)
  11. 计算机实验报告protel,Protel 99 SE使用基础 实验报告.doc
  12. 阿里AndFix与sophix热修复原理解析
  13. 【Visual C++】游戏开发笔记四十一 浅墨DirectX教程之九 为三维世界添彩 纹理映射技术 一
  14. 产品驱动程序一览表(ThinkPad X61)
  15. C语言入门实战(11):输入一组正整数,求逆序数的和
  16. 除了性以外,有没有快速、高效的释放压力、清空大脑的方式?
  17. 移动100m宽带慢的要死_移动宽带不稳定怎么办,移动100m宽带慢解决方法
  18. 既想吸猫又不想当猫奴?这款治愈系的机器人或许会适合你
  19. 2010考研数学二第(15)题——导数应用:单调区间与极值
  20. 小米4电信4G_2014716_官方线刷包_救砖包_解账户锁

热门文章

  1. (个人记录)安装pycocotools库出现Could not build wheels for pycocotools which use PEP 517 and cannot be install
  2. 将工业ISM和消费者ISM频段设备迁移到LoRaWAN,LoRa设备开发参考指南(二十)
  3. 联接(CROSS JOIN、JOIN、OUTER JOIN)
  4. 广播电视相关信息系统安全 等级保护测评要求
  5. mybatis-generator同名表的处理
  6. 078 周期函数定积分性质及定积分三大性质总结
  7. 计算机格式怎么调,怎么改电脑硬盘格式?
  8. cad画直角命令_在cad中怎么画角度?cad画角度三种方法介绍
  9. 云服务器与物理服务器有什么区别?
  10. pgsql 日期转换