Android电话拨打流程源码分析.docx
### Android电话拨打流程源码分析 #### 概述 本文主要针对Android 5.0版本中的开源项目(AOSP)进行电话拨打流程的源码分析。通过对拨打电话过程中的关键类和方法进行深入剖析,帮助读者更好地理解Android系统中电话模块的工作原理。 #### 关键流程与实现 ##### 1. **DialpadFragment.java** `DialpadFragment` 类是Android拨号界面的核心组件之一。在创建视图时,该类会检查是否需要显示屏幕上的“拨打”按钮,并设置相应的点击监听器。 ```java // Check whether we should show the on-screen "Dial" button. mDialButton = mAdditionalButtonsRow.findViewById(R.id.dialButton); if (r.getBoolean(R.bool.config_show_onscreen_dial_button)) { mDialButton.setOnClickListener(this); } else { mDialButton.setVisibility(View.GONE); // It's VISIBLE by default mDialButton = null; } ``` 当用户点击“拨打”按钮时,触发单击事件响应,进而执行 `dialButtonPressed()` 方法。 ```java public void onClick(View view) { switch (view.getId()) { case R.id.dialButton: { mHaptic.vibrate(); dialButtonPressed(); return; } } } ``` ##### 2. **dialButtonPressed()** 该方法用于处理实际的电话呼叫操作。首先检查是否已经输入了电话号码,如果没有,则进行相应提示或处理;如果已经输入了号码,则根据号码的不同情况进行判断和处理: - 如果号码被明确禁止,将弹出错误对话框并清除已输入的号码。 - 如果号码格式不正确,也会清除号码并给出提示。 - 如果号码有效,则构造一个 Intent 对象来启动电话呼叫界面。 ```java public void dialButtonPressed() { if (mDigits == null) { Log.e(TAG, "dialButtonPressed, mDigits == null"); return; } if (isDigitsEmpty()) { handleDialButtonClickWithEmptyDigits(); } else { final String number = mDigits.getText().toString(); if (number != null && !TextUtils.isEmpty(mProhibitedPhoneNumberRegexp) && number.matches(mProhibitedPhoneNumberRegexp) && (SystemProperties.getInt("persist.radio.otaspdial", 0) != 1)) { Log.i(TAG, "The phone number is prohibited explicitly by a rule."); if (getActivity() != null) { DialogFragment dialogFragment = ErrorDialogFragment.newInstance( R.string.dialog_phone_call_prohibited_title); dialogFragment.show(getFragmentManager(), "phone_prohibited_dialog"); } mDigits.getText().clear(); } else if (number != null && (number.startsWith(",") || number.startsWith(";"))) { mDigits.getText().clear(); if (getActivity() != null) { Toast.makeText(getActivity(), getText(R.string.invalid_number), Toast.LENGTH_SHORT).show(); } } else { final Intent intent = ContactsUtils.getCallIntent(number, (getActivity() instanceof DialtactsActivity ? ((DialtactsActivity) getActivity()).getCallOrigin() : null)); startActivity(intent); mClearDigitsOnStop = true; mDigits.getText().clear(); if (mFlagIntentNumber) { //... } } } } ``` ##### 3. **ContactsUtils.getCallIntent()** `ContactsUtils.getCallIntent()` 是一个辅助方法,用于根据输入的电话号码创建一个 Intent 对象,以便启动电话呼叫界面。该方法还接收一个可选参数 `callOrigin`,表示电话呼叫的来源。 ```java final Intent intent = ContactsUtils.getCallIntent(number, (getActivity() instanceof DialtactsActivity ? ((DialtactsActivity) getActivity()).getCallOrigin() : null)); ``` #### 总结 通过以上对 `DialpadFragment` 类中相关代码的分析,我们可以了解到Android系统中电话拨打流程的大致逻辑。从用户界面到后台处理,每一步都有其特定的功能和作用,共同构成了完整的电话拨打功能。对于开发者而言,深入理解这些源码不仅有助于解决实际开发过程中遇到的问题,也能为后续的系统扩展和优化提供指导思路。
剩余35页未读,继续阅读
- 粉丝: 336
- 资源: 2
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助