电话拨打的app层流程
2013-08-28 11:05
197 查看
最近了解了下在APP层通过发送intent来实现拨打电话的具体流程,通过研究log得出结论如下:
以上代码添加在任意app中都可以实现拨打电话号码为s的功能,s的类型为string。接收该intent的activity位于Phone中的OutgoingCallBroadcaster.java中。所以OutgoingCallBroadcaster的onCreate方法会在intent发出后第一时间被调用。进入OutgoingCallBroadcaster之后首先进入processIntent()方法对intent进行处理,在该方法里面会对收到的intent进行初步判断。
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至此,拨号界面总算蹦出来了。
Intent i = new Intent(Intent.ACTION_CALL); i.setData(Uri.fromParts("tel", s, null)); i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(i);
以上代码添加在任意app中都可以实现拨打电话号码为s的功能,s的类型为string。接收该intent的activity位于Phone中的OutgoingCallBroadcaster.java中。所以OutgoingCallBroadcaster的onCreate方法会在intent发出后第一时间被调用。进入OutgoingCallBroadcaster之后首先进入processIntent()方法对intent进行处理,在该方法里面会对收到的intent进行初步判断。
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至此,拨号界面总算蹦出来了。
相关文章推荐
- MTK平台拨打电话流程(Contacts--App层)
- (O)Telephony分析之通话流程分析(三)拨打电话流程分析(下)
- (O)Telephony分析之通话流程分析(二)拨打电话流程分析(上)
- Android N 拨打电话流程
- Android电话拨打流程源码分析
- Android6.0拨打电话流程
- android N 拨打电话流程(MO)
- Android 拨打电话流程
- 接电话、拨打电话的流程管理
- Android N拨打电话的流程
- Android电话拨打流程源码分析
- 接电话、拨打电话的流程管理
- Android电话拨打流程源码分析
- android N 拨打电话流程(MO)
- android 添加菜单 开发流程 短信发送与拨打电话
- Android电话拨打流程源码分析
- Android5.1 Telephony流程分析——拨打电话流程(MO CALL)
- android 7.0 拨打接听蓝牙电话code流程
- Android O 拨打电话流程之呼出
- Android电话拨打流程源码分析