拨号流程主要涉及Dialer Telecom framework/base/telecom Telephony framework/base/telephony这几个模块
在这里我们从Telecom这里开始介绍拨号流程首先看图
1)这里我们主要是创建了Call以及connection创建,其中重点在CallsManager类中的startOutgoingCall方法和placeOutgoingCall方法。
2) 这里主要是使用当前的call通过binder去创建connection的流程
bindercall bind成功以后会setBinder以及调用handleSuccessfulConnection,设置mServiceInterface的值最终要的还是调用createConnection创建连接。在这里需要注意Binder2和TelephonyConnectionService的连接是使用bind而实现的,TelephonyConnectionService继承了framework/base/telecom的ConnnectionService, ConnectionService实现了IConnectionService.aidl. 在经过binder2的绑定
Telecom和Telephony可以进行直接通信了。
public void createConnection(final Call call, final CreateConnectionResponse response) {
Log.d(this, "createConnection(%s) via %s.", call, getComponentName());
BindCallback callback = new BindCallback() {
@Override
public void onSuccess() {
String callId = mCallIdMapper.getCallId(call);
....
try {
mServiceInterface.createConnection(
call.getConnectionManagerPhoneAccount(),
callId,
connectionRequest,
call.shouldAttachToExistingConnection(),
call.isUnknown(),
Log.getExternalSession());
} catch (RemoteException e) {
Log.e(this, e, "Failure to createConnection -- %s", getComponentName());
mPendingResponses.remove(callId).handleCreateConnectionFailure(
new DisconnectCause(DisconnectCause.ERROR, e.toString()));
}
}
@Override
public void onFailure() {
Log.e(this, new Exception(), "Failure to call %s", getComponentName());
response.handleCreateConnectionFailure(new DisconnectCause(DisconnectCause.ERROR));
}
};
mBinder.bind(callback, call);
}
3) 这里我们需要关注的是Connection的创建,在这一步一共需要创建两个Connection一个Connection是TelephonyConnection,这个connection 是继承TelephonyConnection最终继承自framework telecom的Connection
这的个connection中保留了一个mOrignalConection 这个connection是com.android.internal.telephony.Connection
这个originalconnection是在 framework/opt/telephony中创建的。
这里我们看个方法:根据当前Phone的类型创建对应的connection
private TelephonyConnection createConnectionFor(
Phone phone,
com.android.internal.telephony.Connection originalConnection,
boolean isOutgoing,
PhoneAccountHandle phoneAccountHandle,
String telecomCallId,
boolean isAdhocConference) {
TelephonyConnection returnConnection = null;
int phoneType = phone.getPhoneType();
if (phoneType == TelephonyManager.PHONE_TYPE_GSM) {
returnConnection = new GsmConnection(originalConnection, telecomCallId, isOutgoing);
} else if (phoneType == TelephonyManager.PHONE_TYPE_CDMA) {
boolean allowsMute = allowsMute(phone);
returnConnection = new CdmaConnection(originalConnection, mEmergencyTonePlayer,
allowsMute, isOutgoing, telecomCallId);
}
.....
return returnConnection;
}
在Calltracker中的dial完成以后拨号算是完成了一半因为,这里拨号已经结束了,但是拨号状态的返回以及更新我会在单独的列一篇来将这块。