最近了解了下在APP层通过发送intent来实现拨打电话的具体流程,通过研究log得出结论如下:
Intent i = new Intent(Intent.ACTION_CALL); i.setData(Uri.fromParts("tel", s, null)); i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(i);
1.如果是EMERGENCY CALL并且拨打的号码也是EMERGENCY号码的话,就会将callNow参数设为true。然后调用PhoneGlobals.getInstance().wakeUpScreen();点亮屏幕,然后执行PhoneGlobals.getInstance().callController.placeCall(intent);方法直接将拨号送出,placeCall的具体方法就不做分析了,这又是一大串的东西。
2.如果只是普通的CALL请求,则callNow参数仍为false,此时会用到一个callOrigin的参数,String callOrigin = intent.getStringExtra(PhoneGlobals.EXTRA_CALL_ORIGIN);由于在intent中并未设置这个值,所以会调用PhoneGlobals.getInstance().resetLatestActiveCallOrigin();方法对callOrigin处理,处理的结果就是发出一个新的broadcast,并由OutgoingCallBroadcaster中的receiver来接收,新的intent为NEW_OUTGOING_CALL,具体内容参照源码,这里就不一一列举了。
OutgoingCallReceiver是定义在OutgoingCallBroadcaster内部的,在接收新发出的intent后会执行startSipCallOptionHandler()方法,在执行之前同样会对接收到的intent做相关判定(主要是关于ota升级),在startSipCallOptionHandler()方法中调用PhoneGlobals.getInstance().callController.placeCall(newIntent);实现电话的最终拨出。
关于placecall方法:
该方法位于phone程序的CallController.java文件中,在该方法的最后调用到了displayCallScreen方法,然后跳转到InCallScreen.class中,最后是callcard至此,拨号界面总算蹦出来了。