一、关于修改

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,始终显示在通话界面上):




 


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


android挂断电话接口 电话挂断按键怎么设置_menu


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

首先看下有什么难点:

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

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

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

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

1、通过代码能得知源码中的来电信息是在callcard.java文件中通过phoneutils.startgetcallerinfo来获取到的,而负责跳转到incallscreen的是phoneapp.java。但是这里面有个问题,callcard是包含在incallscreen中的。我们新建的来电界面是不会有callcard.java文件的。

解决办法是将phoneutils.startgetcallerinfo移植到我们自己的来电页面中

(1)刚才说到负责跳转来电页面的是phoneapp.java文件,在phoneapp中有个displaycallscreen(里面包含了getcallscreenclassname方法)方法负责跳到incallscreen中去,我们只需要将里面的class类改成我们来电页面类就好了

(2)来电跳到自己的来电界面后,在oncreate去调用phoneutils.startgetcallerinfo。里面的参数:startgetcallerinfo( context, c, listener, cookie)。

里面的参数传入值请参考callcard.java文件。返回得到的callerinfo里面就是来电者信息了,然后再将来电信息显示在UI上

(3)这里面要提醒一下,联系人头像用一次startgetcallerinfo可能会获取不到,于是android给它重新加了一个方法