接电话流程学习

(一)android打电话流程:

1、打电话的入口是在OutgoingCallBroadcaster这个类中,下层我就没深入去理解了,此类是继承的Activity,在其oncreate方法里面用intent去接收需要拨打的电话,然后判断此号码是否为紧急号码

(1)如果为紧急号码:立即启动InCallScreen类,并发送广播

(2)如果不是为紧急号码:只发送“Intent.ACTION_NEW_OUTGOING_CALL”广播,并不立即启动InCallScreen类

 

2、OutgoingCallReceiver,此类是OutgoingCallBroadcaster里的一个内部类,顾名思义,主要用于接收OutgoingCallBroadcaster发送的广播

判断是否已经启动InCallScreen,若没有启动则进行一些初始化操作,比如判断若phonetype为CDMA,则初始化OTA。并从intent中取出电话号码并启动incallscreen类(号码已由intent带给了incallscreen类)

名词解释:CDMA(一种通讯技术,可以减少手机之间的干扰,通话品质也比GSM好)

OTA(一种空中下载技术,是通过GSM或CDMA的空中接口对SIM卡数据及应用进行远程管理的技术)

 

3、InCallScreen

此类为通话核心类,这个类中东西很复杂,负责整个通话界面(包括单方和多方通话),并且在首次oncreate后,就算通话结束也只会调用其onstop方法,此类一直不会被finish()掉。当onstop后若重新打电话则会调用onnewintent()方法,不会再经过oncreate

IncallScreen布局及各个功能

(1)包含CallCard类:CallCard负责通话主要界面(callcard里面又包含call_card_person_info,这个就不细说了),如显示保持恢复按钮,电话头像,通话时间,通话号码或人名以及通话人头像

(2)包含dtmf_twelve_key_dialer配置文件:主要负责通话中拨号键盘的布局

(3)包含InCallTouchUi这个重要的类:主要负责来电时的锁屏界面(往左滑是拒绝来电,往右滑是接听来电),该类继承SlidingTab来实现滑屏效果,后面会说到运用SlidingTab能实现自己的来电锁屏界面




 

(4)包含incallmenu类,主要负责MENU菜单的一些操作(如挂断电话,免提,合并通话等),虽然incallmenu负责MENU的绘画及布局,但是实际onclick后的操作是由incallscreen类来操控的)


打电话时InCallScreen的具体流程

前面说到OutgoingCallReceiver解析号码并启动incallscreen类,第一次启动时首先进入了其oncreate方法

(1)初始化PhoneApp类

(2)增加FLAG参数:FLAG_DISMISS_KEYGUARD(这个参数的作用主要在于解除锁屏,比如锁屏时来电,这时候就需要先解除锁屏再显示画面,这样用户就能在锁屏时接收到来电了~)

(3)setPhone

(4)调用初始化各种组件(callcard,menuview等)

初始化组件等一系列操作后,进入onresume方法:

(1)调用PhoneApp的disablestatusbar,用来更新状态栏(添加拨打电话的图标)

(2)判断是否需要蓝牙连接

(3)判断如果是CDMA通话,则初始化ota状态,并设置通话模型

(4)mPhone.clearDisconnected(); 断开所有网络连接

 

3、PhoneUtils:

顾名思义为工具类,主要用于phone的生成,另外之前所说menu菜单的onclick后的操作是由incallscreen类来操控,实际上呢是phoneutils在做具体的工作(如挂断电话,开启扬声器等),incallscreen只是去调用phoneutils里面的方法而已。


4、PhoneApp:

 

一个普通的类,当拨打电话及接听电话时,负责跳转至incallscreen中,利用这个类我们可以自己去创建非锁屏状态下的来电(原生中不管锁屏还是非锁屏都是一样的来电界面),另外此类还提供display和dismiss方法,以达到显示及关闭incallscreen的目的

 

5、CallNotifier:

监听phone状态的改变,假如监听到为挂断电话时,调用phoneapp中的dismiss方法使incallscreen关闭掉

 

 

 

 

一、关于修改

1、先说一个比较简单的修改动作,在原生机中有menu菜单,通过MENU可以进行扬声器,静音,挂断等功能,但是menu本身有个特性就是点击屏幕后菜单就会消失,公司给的需求是使MENU能够一直显示在屏幕上,之前试了好大功夫想把点击屏幕菜单消失这个功能给屏蔽掉,可惜试了半天也没弄出来,我也不清楚是否是在底层就给设定好了的,后来网上说自己重写个VIEW来“冒充”成MENU,想了想不失为一个好方法。

phone源码中,涉及到MENU的JAVA文件有:InCallMenuView(继承ViewGroup)、InCallMenu和InCallMenuItemView(继承TextView),层级为InCallMenu包含InCallMenuView,而InCallMenuView又包含InCallMenuItemView。InCallmenu中有很多的InCallMenuItemView(各个MENU键的显示),也设定了各个MENU键的ICON,Text什么的,将其onclicklistener绑定在了incallscreen上。

如果想实现“冒充”的功能:

(1)修改控件UI部分:在InCallMenu中可以设定UI属性

(2)编写incallmenu配置文件(设定各个MENU键的marginleft什么的)

(3)在InCallScreen的配置文件中导入incallmenu这个配置文件,表示将MENU一直存在于通话界面中(原生中是点击了MENU才会去导入)

(4)当然是在incallscreen里屏蔽MENU键,以便两个MENU界面重复了

附对比图:

原生的(当MENU点击时菜单显示):

 

经过修改后的(无论点不点击MENU,始终显示在通话界面上):


2、关于来电锁屏

大家都知道锁屏来电时,其实只是在incallscreen中显示了incalltouchui的界面(相当于来电页面上面贴了一个keyguard而已),如图:



那么公司需求想换一个来电锁屏页面,之前我想到有两种方法:1、直接在incallscreen中新建一个锁屏页面,后来发现incallscreen中本来涉及到的布局就相当多,如果再新建个锁屏页面很难将页面调规整。。于是采用了第二种方法,就是直接在外部新建锁屏页面,然后通过此锁屏页面再跳转到incallscreen中,但中间的操作还是很多。

首先看下有什么难点:

1、来电时,系统是将号码直接传给incallscreen的,我们需要从某个代码层去截取号码及联系人显示到我们自己的锁屏页面中

2、来电时,如果锁屏状态,系统会将锁解开并高亮显示incallscreen,我们需要高亮显示自己的锁屏页面

3、若有未接来电时,需要将自己的锁屏页面关闭并增加状态栏的未接提示


要解决第一点,首先要找到是哪里的代码层传号码给incallscreen的

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值