Android Tel 拨打电话及来电流程分析

打电话流程

接下来分析一下打电话的流程。输入电话号码的流程这里忽略。输入电话号码之后会点击拨打图标。之后就会走拨打电话的流程了。这部分是在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 extra
	intent.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.java
    public 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;
之后拨打电话的流程如下图:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值