拨打电话,是从通话的拨号盘开始的,而拨号盘的界面是在DialpadFragment,因此,需要从这个地方进行分析
知道getCallIntent的参数分别为,
第一个参数为刚刚生成的Uri对象,其是以tel:为前缀的
第二个参数由于并未设置过,因此为null
第三个参数由于没有设置过视频通话,因此为VideoProfile.STATE_AUDIO_ONLY,语音通话
第四个参数为传入的LogState.INITIATION_DIALPAD
一.拨号盘界面拨号流程
public void onClick(View view) {
......
if (resId == R.id.dialpad_floating_action_button) {
view.performHapticFeedback(HapticFeedbackConstants.VIRTUAL_KEY);
// 处理Dial Button点击事件
handleDialButtonPressed();
}
......
}
通过调用handleDialButtonPressed方法,处理点击拨号按钮后的流程
private void handleDialButtonPressed() {
// 没有输入号码的情况下,暂不讨论
if (isDigitsEmpty()) { // No number entered.
handleDialButtonClickWithEmptyDigits();
} else {
......
// uri加上tel前缀,并且type设置为INITIATION_DIALPAD,生成URI
final Intent intent = new CallIntentBuilder(number).setCallInitiationType(LogState.INITIATION_DIALPAD).build();
// Leo, 尝试去启动一个Activity,如果启动不了,会弹出一个 "Activity is not found" 的Toast框
DialerUtils.startActivityWithErrorToast(getActivity(), intent);
// Leo,隐藏拨号盘,并且清除号码盘上的号码
hideAndClearDialpad(false);
}
}
可以看到此处通过初始化CallIntentBuilder,然后调用其build方法,生成一个Intent对象,并作为参数,调用DialerUtils的startActivityWithErrorToast方法
public static class CallIntentBuilder {
......
public CallIntentBuilder(Uri uri) {
mUri = uri;
}
public CallIntentBuilder(String number) {
this(CallUtil.getCallUri(number));
}
public CallIntentBuilder setCallInitiationType(int initiationType) {
mCallInitiationType = initiationType;
return this;
}
public Intent build() {
// Leo, 初始化一个Intent
return getCallIntent(
mUri,
mPhoneAccountHandle,
mIsVideoCall ? VideoProfile.STATE_BIDIRECTIONAL : VideoProfile.STATE_AUDIO_ONLY,
mCallInitiationType);
}
}
从这边来看,首先通过构造方法,将number生成一个Uri,然后通过build方法调用getCallIntent方法,返回一个Intent,而通过上述了解,
知道getCallIntent的参数分别为,
第一个参数为刚刚生成的Uri对象,其是以tel:为前缀的
第二个参数由于并未设置过,因此为null
第三个参数由于没有设置过视频通话,因此为VideoProfile.STATE_AUDIO_ONLY,语音通话
第四个参数为传入的LogState.INITIATION_DIALPAD
public static Intent getCallIntent(
Uri uri, PhoneAccountHandle accountHandle, int videoState, int callIntiationType) {
// 初始化一个Intent,action为CALL_ACTION,Data为uri
final Intent intent = new Intent(CALL_ACTION, uri);
// 目前应该是没有videoState的,即为VideoProfile.STATE_AUDIO_ONLY
intent.putExtra(TelecomManager.EXTRA_START_CALL_WITH_VIDEO_STATE, videoState);
final Bundle b = new Bundle();
// 设置其INITIATION_TYPE,此处第一次为LogState.INITIATION_DIALPAD
b.putInt(EXTRA_CALL_INITIATION_TYPE, callIntiationType);
// 设置其Extra
intent