android拨号分两种,一种经过拨号器,输入号码,然后按CALL键拨打出去,还有一种经过联系人或者通话记录拨打出去。

第一种方式:TwelveKeyDialer.java中的placeCall()

void placeCall() {
final String number = mDigits.getText().toString();
if (number == null || !TextUtils.isGraphic(number)) {
// There is no number entered.
playTone(ToneGenerator.TONE_PROP_NACK);
return;
}
Intent intent = new Intent(Intent.ACTION_CALL_PRIVILEGED,
Uri.fromParts("tel", number, null));
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
mDigits.getText().clear();
finish();
}

定一个一个ACTION_CALL_PRIVILEGED,自动匹配上OutgoingCallBroadcaster

if (Intent.ACTION_CALL_PRIVILEGED.equals(action)) {
action = emergencyNumber
? Intent.ACTION_CALL_EMERGENCY
: Intent.ACTION_CALL;
intent.setAction(action);
}

区分号码是否为紧急号码,是紧急号码的话立即起一个InCallScreen的Activity,不是的话发出广播,转发一个拨号Intent,

Intent broadcastIntent = new Intent(Intent.ACTION_NEW_OUTGOING_CALL);
if (number != null) broadcastIntent.putExtra(Intent.EXTRA_PHONE_NUMBER, number);
broadcastIntent.putExtra(EXTRA_ALREADY_CALLED, callNow);
broadcastIntent.putExtra(EXTRA_ORIGINAL_URI, intent.getData().toString());
if (LOGV) Log.v(TAG, "Broadcasting intent " + broadcastIntent + ".");
sendOrderedBroadcast(broadcastIntent, PERMISSION, null, null,
Activity.RESULT_OK, number, null);

而OutgoingReceiver接收到广播以后,才起一个InCallScreen

Intent newIntent = new Intent(Intent.ACTION_CALL, uri);
newIntent.putExtra(Intent.EXTRA_PHONE_NUMBER, number);
newIntent.setClass(context, InCallScreen.class);
newIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

context.startActivity(newIntent);

这样,这个拨打的过程就完成了。

如果在历史通话记录界面,响应用户的click请求

protected void onListItemClick(ListView l, View v, int position, long id) {
static final int COLUMN_INDEX_NUMBER = 4; | Intent intent = new Intent(this, CallDetailActivity.class);
| intent.setData(ContentUris.withAppendedId(CallLog.Calls.CONTENT_URI, id));
@Override | startActivity(intent);
protected void onCreate(Bundle icicle) { | }
起一个CallDetailActivity,在CallDetailActivity界面,如果当前电话是空闲的,直接发一个ACTION_CALL_PRIVILEGED给OutgoingCallBroadcaster

TelephonyManager tm = (TelephonyManager) |
getSystemService(Context.TELEPHONY_SERVICE); | int callType = cursor.getInt(CALL_TYPE_COLUMN_INDEX);
if (tm.getCallState() == TelephonyManager.CALL_STATE_IDLE) { | if (!number.startsWith("+") &&
Intent callIntent = new Intent(Intent.ACTION_CALL_PRIVILEGED, | (callType == Calls.INCOMING_TYPE
Uri.fromParts("tel", mNumber, null)); | || callType == Calls.MISSED_TYPE)) {
startActivity(callIntent);

更多相关文章

  1. Android电话Phone UI分析
  2. Android拨号键盘增加魔力爱心数字
  3. Android中自制通讯录中显示出数据库中的姓名和电话号码进行打电
  4. Android小程序——拨打电话
  5. Android(安卓)之 自动拨号
  6. Android笔记:Android(安卓)使用Intent拨打电话的两种方式以及差别
  7. android事件处理的四种写法--电话拨号为例
  8. Android(安卓)使用HTTPClient调用Web请求(查询手机号码区域)
  9. Android学习心得——NeverLost

随机推荐

  1. Android(安卓)自定义控件之组合控件
  2. Android——Intent在Activity的使用详解-
  3. Glide源码解析篇之框架主体结构(一)
  4. 00003 不思议迷宫.0011.2:Android新版中的
  5. [置顶] 基于Proxy思想的Android插件框架
  6. Android同时按下多个按钮
  7. 第21章 0113-jQuery常用DOM操作与Ajax,学
  8. Android数据库更新onupgrade
  9. Android的联通性---USB主机模式(二)
  10. Android补间动画详情