Android O 拨打电话流程之来电
2017-11-10 23:16
1461 查看
当底层Call状态发生改变时,会上报消息RIL_UNSOL_RESPONSE_CALL_STATE_CHANGED
/hardware/ril/libril/ril_service.cpp
![](https://oscdn.geek-share.com/Uploads/Images/Content/202010/10/4fa87a5bdf5c5e922a37b253d4f92c59)
/frameworks/opt/telephony/src/java/com/android/internal/telephony/RadioIndication.java
![](https://oscdn.geek-share.com/Uploads/Images/Content/202010/10/56deb7a066b77db4ceee0b4f4e011f89)
/frameworks/opt/telephony/src/java/com/android/internal/telephony/RIL.java
/frameworks/opt/telephony/src/java/com/android/internal/telephony/BaseCommands.java
BaseCommands中建立了变量RegistrantList mCallStateRegistrants = new RegistrantList();
![](https://oscdn.geek-share.com/Uploads/Images/Content/202010/10/55e3a2061fdb136cd5256606d8740ba6)
RegistrantList消息机制,底层其实也是利用Handler实现,主要利用观察者模式,一个发起通知,所有的观察者都能够接收到.
一般都在注册的类里面接收监听,所以RIL层发起的通知会在GsmCdmaCallTracker里面处置,注意注册事件里面的消息:
EVENT_CALL_STATE_CHANGE
/frameworks/opt/telephony/src/java/com/android/internal/telephony/GsmCdmaCallTracker.java
![](https://oscdn.geek-share.com/Uploads/Images/Content/202010/10/18e2b870340c2bb149e38817d9f96b0b)
handleMessage()消息处理:
![](https://oscdn.geek-share.com/Uploads/Images/Content/202010/10/e14b807da798cb7f2c1acf6a1da4a0c0)
pollCallsWhenSafe在父类CallTracker中定义
![](https://oscdn.geek-share.com/Uploads/Images/Content/202010/10/f258b1780b04c86d0ba24729e77951d7)
发起CallList查询,调用RIL层的getCurrentCalls
GsmCdmaCallTracker中的handleMessage()消息处理:
![](https://oscdn.geek-share.com/Uploads/Images/Content/202010/10/a5caaf2fde4101b51b8c8aef6f9638a9)
![](https://oscdn.geek-share.com/Uploads/Images/Content/202010/10/74a061866225f635e70d6e46a7afc285)
![](https://oscdn.geek-share.com/Uploads/Images/Content/202010/10/96a94ac192d77ee6785570de34722cc3)
![](https://oscdn.geek-share.com/Uploads/Images/Content/202010/10/a910b8112569762aa92d75c50e4db65c)
调用phone发起通知
/frameworks/opt/telephony/src/java/com/android/internal/telephony/Phone.java
![](https://oscdn.geek-share.com/Uploads/Images/Content/202010/10/502ed0dc965871aee90d4cf224f19796)
查看注册方法:
![](https://oscdn.geek-share.com/Uploads/Images/Content/202010/10/19c0b16c563ef9ac0d116257944e1242)
有两个地方注册来该方法:
/frameworks/opt/telephony/src/java/com/android/internal/telephony/CallManager.java
![](https://oscdn.geek-share.com/Uploads/Images/Content/202010/10/3ecd09911eab72ec8ecf36422c0b44d9)
CallManager中处理,如果当前正在拨号,或有多余一路的来电,直接挂掉当前来电,否则继续发起通知
/packages/services/Telephony/src/com/android/services/telephony/PstnIncomingCallNotifier.java
![](https://oscdn.geek-share.com/Uploads/Images/Content/202010/10/0e4cc433e3010cff2db2a1814bad91b4)
![](https://oscdn.geek-share.com/Uploads/Images/Content/202010/10/229005519ab9a3b146c517cf8ea85a68)
![](https://oscdn.geek-share.com/Uploads/Images/Content/202010/10/370870adc4e973fc8e7978b0cfb9ffc9)
/frameworks/base/telecomm/java/android/telecom/TelecomManager.java
![](https://oscdn.geek-share.com/Uploads/Images/Content/202010/10/c8cbd681746f20a488027fd3a756d474)
/packages/services/Telecomm/src/com/android/server/telecom/components/TelecomService.java
![](https://oscdn.geek-share.com/Uploads/Images/Content/202010/10/22d15b36dbf80ebbc18623666c80e2ce)
![](https://oscdn.geek-share.com/Uploads/Images/Content/202010/10/d687661d58c30afa0126e953a892ba03)
发现最终进入TelecomSystem中去,并调用getTelecomServiceImpl方法,主要获取对象TelecomServiceImpl
![](https://oscdn.geek-share.com/Uploads/Images/Content/202010/10/f7749c5029d908bc3d05737e19661f74)
/packages/services/Telecomm/src/com/android/server/telecom/TelecomServiceImpl.java
![](https://oscdn.geek-share.com/Uploads/Images/Content/202010/10/29be8a08e6e8cdec691bc0095ce3ae75)
发现在TelecomServiceImpl中的成员变量mBinderImpl 是具体实现类
![](https://oscdn.geek-share.com/Uploads/Images/Content/202010/10/4856299828b82f3a868c3bfc45acc32a)
![](https://oscdn.geek-share.com/Uploads/Images/Content/202010/10/fde15883210a49138bbdd522cc86c4df)
调用CallIntentProcessor的内部静态类来处理来电,使用Intent来交互,ACTION_INCOMING_CALL
/packages/services/Telecomm/src/com/android/server/telecom/CallIntentProcessor.java
![](https://oscdn.geek-share.com/Uploads/Images/Content/202010/10/9fe44e1d1649596f08533fb2edc1e36e)
最终还是调用CallIntentProcessor的静态方法:processIncomingCallIntent
![](https://oscdn.geek-share.com/Uploads/Images/Content/202010/10/bc774fa3791591bf40ac0139ef547b36)
/packages/services/Telecomm/src/com/android/server/telecom/CallsManager.java
![](https://oscdn.geek-share.com/Uploads/Images/Content/202010/10/2ceb79a9a18b226b92fb327eb00ddb26)
![](https://oscdn.geek-share.com/Uploads/Images/Content/202010/10/436bc963c950486c125653e393f04f49)
在CallsManager中创建Call对象,之后调用Call对象的StartCreateConnection去创建连接
/packages/services/Telecomm/src/com/android/server/telecom/Call.java
![](https://oscdn.geek-share.com/Uploads/Images/Content/202010/10/9855f4e50214c5c49691df423e2c4289)
/packages/services/Telecomm/src/com/android/server/telecom/CreateConnectionProcessor.java
![](https://oscdn.geek-share.com/Uploads/Images/Content/202010/10/239130dcd2ca8cadc3a610c3766f87c4)
private void attemptNextPhoneAccount()方法中调用
![](https://oscdn.geek-share.com/Uploads/Images/Content/202010/10/c52a2e25c7c192ece87e1d3458e70b32)
/packages/services/Telecomm/src/com/android/server/telecom/ConnectionServiceWrapper.java
![](https://oscdn.geek-share.com/Uploads/Images/Content/202010/10/1cc2a354976ae745dd713887f609e90d)
连接创建成功后,调用callback方法中的onSuccess方法,失败调用回调消息的onFailure方法, 在onSuccess方法中调用
![](https://oscdn.geek-share.com/Uploads/Images/Content/202010/10/a87fda76ffcfddf8b86bbda8064da1c2)
/frameworks/base/telecomm/java/android/telecom/ConnectionService.java
![](https://oscdn.geek-share.com/Uploads/Images/Content/202010/10/c00ffcd595495dccace51572a1cfab3f)
这里走的是来电,所以创建来电连接,调用onCreateIncomingConnection,但是返回为空.这个方法的实现在ConnectionService的子类TelephonyConnectionService
![](https://oscdn.geek-share.com/Uploads/Images/Content/202010/10/a98b88672ec5e0a8b1c3ddfd33aea5da)
那么问题来了?为什么子类对象是什么时候建立的呢?
/packages/services/Telecomm/src/com/android/server/telecom/ServiceBinder.java
ConnectionServiceWrapper类的createConnection中调用了的mBinder.bind方法,其实就是调用ServiceBinder的内部类Binder2,该方法中建立来
ServiceConnection connection = new ServiceBinderConnection(call);
![](https://oscdn.geek-share.com/Uploads/Images/Content/202010/10/7e6e25da0fcfb35e751cdbf3d1fc618e)
![](https://oscdn.geek-share.com/Uploads/Images/Content/202010/10/4d9baeadb499372bf0e5cf163daab5aa)
该方法中调用了setBinder(binder),这个方法和后面的有关系
![](https://oscdn.geek-share.com/Uploads/Images/Content/202010/10/719cc2a4f8a7f5fd7d8f0cec8c809dc9)
ConnectionServiceWrapper.java继承自ServiceBinder,所以调用来该方法来获取TelephonyConnectionService
![](https://oscdn.geek-share.com/Uploads/Images/Content/202010/10/5152b17d3fed9adeda5b4ba2824e5f9a)
/packages/services/Telephony/src/com/android/services/telephony/TelephonyConnectionService.java
![](https://oscdn.geek-share.com/Uploads/Images/Content/202010/10/09477d46d72c0966f626bfc1bdd0c1ce)
![](https://oscdn.geek-share.com/Uploads/Images/Content/202010/10/44ecd4756c8215136b8e18314bd7d1e1)
该类通过判断phone的类型是GSM还是CDMA来创建对应的连接,并返回创建成功的连接,流程又进入 ConnectionService.java中的CreateConnection
![](https://oscdn.geek-share.com/Uploads/Images/Content/202010/10/d8a68dd6c2f8e302db3404b99445c0e6)
继续调用mAdapter中的handleCreateConnectionComplete
/frameworks/base/telecomm/java/android/telecom/ConnectionServiceAdapter.java
![](https://oscdn.geek-share.com/Uploads/Images/Content/202010/10/aadd6211ba48faa3ff1ad8a00de48ac2)
/packages/services/Telecomm/src/com/android/server/telecom/ConnectionServiceWrapper.java
最终也是调用ConnectionServiceWrapper的内部类Adapter
![](https://oscdn.geek-share.com/Uploads/Images/Content/202010/10/9ad2489b1fe440eed6effb173eb8e263)
最终还是调用ConnectionServiceWrapper自己实现的方法
![](https://oscdn.geek-share.com/Uploads/Images/Content/202010/10/521b9c93493d1ce4c9b879ed8896ef98)
mPendingResponses.remove(callId).handleCreateConnectionSuccess(mCallIdMapper, connection);该方法返回的就是CreateConnectionProcessor.java,实现来接口CreateConnectionResponse
/packages/services/Telecomm/src/com/android/server/telecom/CreateConnectionProcessor.java
![](https://oscdn.geek-share.com/Uploads/Images/Content/202010/10/8f0ccec214ef3fe0dac39eb5f2bbebef)
mCallResponse其实就是Call对象,为什么呢?
这个值是在CreateConnectionProcessor的构造方法中传入
![](https://oscdn.geek-share.com/Uploads/Images/Content/202010/10/2cec9c7ea35b5c69822cfc3368e5f4cb)
这个方法的调用在创建连接的时候传入进来的,看到没,第三个参数,this
![](https://oscdn.geek-share.com/Uploads/Images/Content/202010/10/ec2e00fdc59c2acfc3c635a7391a05e2)
/packages/services/Telecomm/src/com/android/server/telecom/Call.java
public class Call implements CreateConnectionResponse, EventManager.Loggable 看下继承关系,原来Call对象也继承自CreateConnectionResponse
handleCreateConnectionSuccess方法主要逻辑:根据来电还是去电执行对应他的操作
![](https://oscdn.geek-share.com/Uploads/Images/Content/202010/10/10cdfb3cb984a3285a2ee2af7cca67a2)
public class CallsManager extends Call.ListenerBase implements VideoProviderProxy.Listener, CallFilterResultCallback, CurrentUserProxy
Listener是call内部的接口,抽象类Call.ListenerBase实现该接口,具体实现在CallsManager中,所以又进入来CallsManager类
![](https://oscdn.geek-share.com/Uploads/Images/Content/202010/10/eb5f9171322bd2be7ecd2fd96daa9f5d)
![](https://oscdn.geek-share.com/Uploads/Images/Content/202010/10/cdd309f41247449de16019b7d7fde40f)
setCallState为CallState.RINGING,接着判断是否接通,是否写入通话记录,之后调用addCall添加call
![](https://oscdn.geek-share.com/Uploads/Images/Content/202010/10/129b505f02807cc69039695ec0423619)
遍历监听者,并调用onCallAdded方法,InCallController是其中一个观察者
/packages/services/Telecomm/src/com/android/server/telecom/InCallController.java
![](https://oscdn.geek-share.com/Uploads/Images/Content/202010/10/ee99cc4b0a2a220ac0c10483e78f6510)
/frameworks/base/telecomm/java/android/telecom/InCallService.java
![](https://oscdn.geek-share.com/Uploads/Images/Content/202010/10/86783bfe7696e4212c768bbeaf74fe24)
![](https://oscdn.geek-share.com/Uploads/Images/Content/202010/10/02bcdb29950edce6b7ef3eed1ee57904)
接着调用mPhone.internaAddCall
/frameworks/base/telecomm/java/android/telecom/Phone.java
![](https://oscdn.geek-share.com/Uploads/Images/Content/202010/10/181192a1d2caa0f576fef0f4e3ac3395)
![](https://oscdn.geek-share.com/Uploads/Images/Content/202010/10/f6e679adabd556bf528f6f86343aa0bd)
InCallService.java的内部类mPhoneListener,所以调用onCallAdded,但是发现InCallService没有实现
![](https://oscdn.geek-share.com/Uploads/Images/Content/202010/10/fd8cafcd25c92fb4fc3c8491069876e9)
/packages/apps/Dialer/java/com/android/incallui/InCallServiceImpl.java
进入Phone应用的Dialer模块
![](https://oscdn.geek-share.com/Uploads/Images/Content/202010/10/522755bacd195e94c8178999c4f140c3)
/packages/apps/Dialer/java/com/android/incallui/InCallPresenter.java
![](https://oscdn.geek-share.com/Uploads/Images/Content/202010/10/9e38596f233ceb50d22a3857296ba52f)
将call添加到列表中
/packages/apps/Dialer/java/com/android/incallui/call/CallList.java
在CallList的方法onCallAdded中
![](https://oscdn.geek-share.com/Uploads/Images/Content/202010/10/d60e54d47496cc88eba1413d558fa6f9)
![](https://oscdn.geek-share.com/Uploads/Images/Content/202010/10/3c564037418db7dc734cecc5b3c4312c)
public class InCallPresenter implements CallList.Listener
InCallPresenter实现来CallList.Listener,所以又会进入
/packages/apps/Dialer/java/com/android/incallui/InCallPresenter.java
![](https://oscdn.geek-share.com/Uploads/Images/Content/202010/10/e3e3c0299caa0254b687c9e97a60d934)
private InCallState startOrFinishUi(InCallState newState)
![](https://oscdn.geek-share.com/Uploads/Images/Content/202010/10/aa9b3d5b3443360240e8199bc67bd795)
普通电话走的是 mStatusBarNotifier.updateNotification(mCallList);
/packages/apps/Dialer/java/com/android/incallui/StatusBarNotifier.java
![](https://oscdn.geek-share.com/Uploads/Images/Content/202010/10/5af08c8e740a2bd323eaa723513792eb)
MT CALL流程图:
/hardware/ril/libril/ril_service.cpp
/frameworks/opt/telephony/src/java/com/android/internal/telephony/RadioIndication.java
/frameworks/opt/telephony/src/java/com/android/internal/telephony/RIL.java
/frameworks/opt/telephony/src/java/com/android/internal/telephony/BaseCommands.java
BaseCommands中建立了变量RegistrantList mCallStateRegistrants = new RegistrantList();
RegistrantList消息机制,底层其实也是利用Handler实现,主要利用观察者模式,一个发起通知,所有的观察者都能够接收到.
一般都在注册的类里面接收监听,所以RIL层发起的通知会在GsmCdmaCallTracker里面处置,注意注册事件里面的消息:
EVENT_CALL_STATE_CHANGE
/frameworks/opt/telephony/src/java/com/android/internal/telephony/GsmCdmaCallTracker.java
handleMessage()消息处理:
pollCallsWhenSafe在父类CallTracker中定义
发起CallList查询,调用RIL层的getCurrentCalls
GsmCdmaCallTracker中的handleMessage()消息处理:
protected synchronized void handlePollCalls(AsyncResult ar)中
调用phone发起通知
/frameworks/opt/telephony/src/java/com/android/internal/telephony/Phone.java
查看注册方法:
有两个地方注册来该方法:
/frameworks/opt/telephony/src/java/com/android/internal/telephony/CallManager.java
CallManager中处理,如果当前正在拨号,或有多余一路的来电,直接挂掉当前来电,否则继续发起通知
/packages/services/Telephony/src/com/android/services/telephony/PstnIncomingCallNotifier.java
/** * Verifies the incoming call and triggers sending the incoming-call intent to Telecom. * * @param asyncResult The result object from the new ringing event. */ private void handleNewRingingConnection(AsyncResult asyncResult) { Log.d(this, "handleNewRingingConnection"); Connection connection = (Connection) asyncResult.result; if (connection != null) { Call call = connection.getCall(); // Final verification of the ringing state before sending the intent to Telecom. if (call != null && call.getState().isRinging()) { sendIncomingCallIntent(connection); } } }
/frameworks/base/telecomm/java/android/telecom/TelecomManager.java
/packages/services/Telecomm/src/com/android/server/telecom/components/TelecomService.java
发现最终进入TelecomSystem中去,并调用getTelecomServiceImpl方法,主要获取对象TelecomServiceImpl
/packages/services/Telecomm/src/com/android/server/telecom/TelecomServiceImpl.java
发现在TelecomServiceImpl中的成员变量mBinderImpl 是具体实现类
调用CallIntentProcessor的内部静态类来处理来电,使用Intent来交互,ACTION_INCOMING_CALL
/packages/services/Telecomm/src/com/android/server/telecom/CallIntentProcessor.java
最终还是调用CallIntentProcessor的静态方法:processIncomingCallIntent
/packages/services/Telecomm/src/com/android/server/telecom/CallsManager.java
在CallsManager中创建Call对象,之后调用Call对象的StartCreateConnection去创建连接
/packages/services/Telecomm/src/com/android/server/telecom/Call.java
/packages/services/Telecomm/src/com/android/server/telecom/CreateConnectionProcessor.java
private void attemptNextPhoneAccount()方法中调用
/packages/services/Telecomm/src/com/android/server/telecom/ConnectionServiceWrapper.java
连接创建成功后,调用callback方法中的onSuccess方法,失败调用回调消息的onFailure方法, 在onSuccess方法中调用
/frameworks/base/telecomm/java/android/telecom/ConnectionService.java
这里走的是来电,所以创建来电连接,调用onCreateIncomingConnection,但是返回为空.这个方法的实现在ConnectionService的子类TelephonyConnectionService
那么问题来了?为什么子类对象是什么时候建立的呢?
/packages/services/Telecomm/src/com/android/server/telecom/ServiceBinder.java
ConnectionServiceWrapper类的createConnection中调用了的mBinder.bind方法,其实就是调用ServiceBinder的内部类Binder2,该方法中建立来
ServiceConnection connection = new ServiceBinderConnection(call);
该方法中调用了setBinder(binder),这个方法和后面的有关系
ConnectionServiceWrapper.java继承自ServiceBinder,所以调用来该方法来获取TelephonyConnectionService
/packages/services/Telephony/src/com/android/services/telephony/TelephonyConnectionService.java
该类通过判断phone的类型是GSM还是CDMA来创建对应的连接,并返回创建成功的连接,流程又进入 ConnectionService.java中的CreateConnection
继续调用mAdapter中的handleCreateConnectionComplete
/frameworks/base/telecomm/java/android/telecom/ConnectionServiceAdapter.java
/packages/services/Telecomm/src/com/android/server/telecom/ConnectionServiceWrapper.java
最终也是调用ConnectionServiceWrapper的内部类Adapter
最终还是调用ConnectionServiceWrapper自己实现的方法
private final Map<String, CreateConnectionResponse> mPendingResponses = new HashMap<>();
mPendingResponses.remove(callId).handleCreateConnectionSuccess(mCallIdMapper, connection);该方法返回的就是CreateConnectionProcessor.java,实现来接口CreateConnectionResponse
/packages/services/Telecomm/src/com/android/server/telecom/CreateConnectionProcessor.java
mCallResponse其实就是Call对象,为什么呢?
这个值是在CreateConnectionProcessor的构造方法中传入
这个方法的调用在创建连接的时候传入进来的,看到没,第三个参数,this
/packages/services/Telecomm/src/com/android/server/telecom/Call.java
public class Call implements CreateConnectionResponse, EventManager.Loggable 看下继承关系,原来Call对象也继承自CreateConnectionResponse
handleCreateConnectionSuccess方法主要逻辑:根据来电还是去电执行对应他的操作
public class CallsManager extends Call.ListenerBase implements VideoProviderProxy.Listener, CallFilterResultCallback, CurrentUserProxy
Listener是call内部的接口,抽象类Call.ListenerBase实现该接口,具体实现在CallsManager中,所以又进入来CallsManager类
setCallState为CallState.RINGING,接着判断是否接通,是否写入通话记录,之后调用addCall添加call
遍历监听者,并调用onCallAdded方法,InCallController是其中一个观察者
/packages/services/Telecomm/src/com/android/server/telecom/InCallController.java
/frameworks/base/telecomm/java/android/telecom/InCallService.java
接着调用mPhone.internaAddCall
/frameworks/base/telecomm/java/android/telecom/Phone.java
final void internalAddCall(ParcelableCall parcelableCall) { Call call = new Call(this, parcelableCall.getId(), mInCallAdapter, parcelableCall.getState(), mCallingPackage, mTargetSdkVersion); mCallByTelecomCallId.put(parcelableCall.getId(), call); mCalls.add(call); checkCallTree(parcelableCall); call.internalUpdate(parcelableCall, mCallByTelecomCallId); fireCallAdded(call); }
InCallService.java的内部类mPhoneListener,所以调用onCallAdded,但是发现InCallService没有实现
/packages/apps/Dialer/java/com/android/incallui/InCallServiceImpl.java
进入Phone应用的Dialer模块
/packages/apps/Dialer/java/com/android/incallui/InCallPresenter.java
将call添加到列表中
/packages/apps/Dialer/java/com/android/incallui/call/CallList.java
在CallList的方法onCallAdded中
public class InCallPresenter implements CallList.Listener
InCallPresenter实现来CallList.Listener,所以又会进入
/packages/apps/Dialer/java/com/android/incallui/InCallPresenter.java
private InCallState startOrFinishUi(InCallState newState)
普通电话走的是 mStatusBarNotifier.updateNotification(mCallList);
/packages/apps/Dialer/java/com/android/incallui/StatusBarNotifier.java
MT CALL流程图:
相关文章推荐
- Android O 拨打电话流程之呼出
- Android电话拨打流程源码分析
- Android电话拨打流程源码分析
- Android电话拨打流程源码分析
- Android电话拨打流程源码分析
- android N 拨打电话流程(MO)
- Android电话拨打流程源码分析
- Android电话来电流程源码分析
- Android电话拨打流程源码分析
- Android电话来电流程源码分析
- Android电话来电流程源码分析 .
- android 7.0 拨打接听蓝牙电话code流程
- Android N 拨打电话流程
- Android电话拨打流程源码分析
- android拨打电话流程分析
- android当拨打电话时将电话号码和归属地显示于“来电”页面
- Android电话拨打流程源码分析
- Android5.1 Telephony流程分析——拨打电话流程(MO CALL)
- android 拨打电话、 监听来电、监听呼出电话的功能实现
- Android接电话流程、Phone来电过程、phone上层来电话解析 接通电话