拨号流程1

拨号流程主要涉及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完成以后拨号算是完成了一半因为,这里拨号已经结束了,但是拨号状态的返回以及更新我会在单独的列一篇来将这块。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值