Android N 通话界面_InCallActivity

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

本流程图基于MTK平台 Android 7.0,普通来电,本流程只作为沟通学习使用

本篇博客主要来看看整个 IncallUI 界面的容器 InCallActivity

InCallActivity

启动流程

我们知道正常情况下 InCallActivity 的启动分两种情况,MOMT 我们就以 MO 为例来看看它的启动流程(MT其实也差不多)
这里写图片描述

最关键的两个地方:

1.//InCallController.connect 方法中通过binder 绑定到了InCallService 服务
Intent intent = new Intent(InCallService.SERVICE_INTERFACE);

2.//InCallPresenter.getInCallIntent 中指定了启动的界面
intent.setClass(mContext, InCallActivity.class);

类图关系

这里写图片描述

通过上面的类图关系我们可以知道,InCallActivity 是整个 incallUI 的容器,它控制着几乎所有 fragment 的显示和隐藏,然而 InCallPresenter 又控制着 InCallActivity 的创建和销毁。InCallPresenter 还类似于一个状态机,它控制并管理者大部分 与call 相关的状态,incallUI 上面和 call 相关的界面变化都会通过 InCallPresenter 来收集和分发。

界面布局

<!-- In-call Phone UI; see InCallActivity.java. -->
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@android:color/black"
    android:id="@+id/main" >
</FrameLayout>

InCallActivity 的layout 是 incall_screen,然而 incall_screen 的所有代码就只有上面那么6行,只定义了一个占满全屏的 FrameLayout 里面什么子控件都没有,那么复杂的incallUI又是怎么显示出来的呢?
其实 InCallActivity 的作用就如我上面所说,针对界面显示而言它只是一个容器,具体的界面实现是通过加载 CallCardFragment 来显示的(onCreate–>internalResolveIntent–>showCallCardFragment(true)),下面我们就来简单分析一下 CallCardFragment 吧。

CallCardFragment

类图关系

这里写图片描述

部分说明:

  • call_card_fragment 是 CallCardFragment 的布局文件,它里面不仅包含很多控件,还include 了其它的布局文件
  • CallCardFragment 中又包含了 AnswerFragment、DialpadFragment、CallButtonFragment、VideoCallFragment等一系列 fragment
  • CallCardPresenter 控制着整个界面的逻辑处理

界面分析

整体图

声明:下图为了说明,通过特别的代码修改故意显示部分在特殊条件下才会显示的图标,请不要被误导。

这里写图片描述

布局文件call_card_fragment分析

这个布局文件整体是个 RelativeLayout 布局,可以分成上下两个部分(对应于上图):

上半部分

这部分是一个垂直方向的 LinearLayout 布局,包含一个新的布局文件 primary_call_info 和 CallButtonFragment 界面,这里我们重点看一下 primary_call_info 布局文件信息。

primary_call_info

整体是个垂直方向的 LinearLayout 布局:

  1. 第一行:callSubject,call的主题,通过call.getCallSubject方法拿到并显示的字符串,一般都为空,如果为空则设置为不可见GONE。
  2. 第二行:水平的 LinearLayout 布局,包含多个信息,1.workProfileIcon,工作账户图标,通过call.hasProperty(PROPERTY_ENTERPRISE_CALL); 判读是否有这个属性决定显示和隐藏,显示在这行靠右下方、2.callStateIcon,sim卡图标或者WiFicall 图标,包括connection的状态图标,CallCardPresenter.getCallStateIcon 返回不为null则显示、3.videoCallIcon,video通话图标,如果是video通话则显示(VideoUtils.isVideoCall(videoState))、4.callStateLabel,显示当前call的状态字符串,根据CallCardFragment.getCallStateLabelFromState方法来确定显示的字符串(通过CallCardPresenter.getConnectionLabel来区分手机单卡和双卡显示的不同字符串),一直都会显示,并且动态改变。
  3. 第三行:一个RelativeLayout布局,包含两个控件,1.name,显示对方的名字或者电话号码,一直显示、2.photoSmall,显示对方小头像,显示在这行最右边,当底部大头像显示时,这个小头像不显示CallCardFragment.showContactContext。
  4. 第四行:水平的 LinearLayout 包含了多个控件,1.hdAudioIcon,HD图标,通过call.hasProperty(Details.PROPERTY_HIGH_DEF_AUDIO)判断是否显示、2.forwardIcon,呼叫转接图标,表示当前号码是通过指定号码转接过来的,如果Call.getLastForwardedNumber不为null则显示、3.电话类型label,比如: work,monile,sip等,是保存当前联系人时用户自己指定的、4.显示来电号码phoneNumber,如果当前来电不是已存联系人,则name就显示了电话号码,此处就显示地理位置,CallCardPresenter.getNumberForCall、5.elapsedTime,显示当前电话接通后已经过去的时间,显示在这行的最右边。
  5. 第五行:callTypeLabel,如果当前是SIP phone 的话显示这个textview。
CallButtonFragment

这个在之前的博客中有详细介绍,可以参考:Android N Phone_通话界面_CallButtonFragment 这篇博客。

下半部分

下半部分就包含很多内容了,它们相互并列重叠,大部分通过代码动态控制显示和隐藏。

相关说明如下:
由上到下分别为:

  • answer_and_dialpad_container,是一个FrameLayout,我们的 AnswerFragmentr界面和 DialpadFragment界面通过 InCallActivity.getContainerIdForFragment 方法动态的显示在这个控件上面,它可以覆盖整个下半部分。
  • secondary_call_info,include 了另外一个布局文件,显示在下半部分的最底部,如果当前有 activity 的 call 和 hold 的 call ,则此处显示 hold call 的信息,并且点击会切换 activity 和 hold 状态。
  • manage_conference_call_button,include 了另外一个布局文件,显示在整体的最底部,如果当前是会议电话则显示,最终通过InCallActivity.createNewFragmentForTag去显示ConferenceManagerFragment。
  • floating_end_call_action_button,显示在整体的底部居中,通话的挂断按钮。
  • progressSpinner,ProgressBar进度条,通过 CallCardPresenter.maybeShowProgressSpinner 控制显示和隐藏进度条
  • VideoCallFragment,显示在整个下半部分,布局文件video_call_fragment,通过 ViewStub占位符来加载具体的 layout 布局文件 video_call_views,通过 VideoCallFragment.inflateVideoUi 控制是否 inflate 具体的布局文件,从而控制VideoCallFragment 的显示和隐藏,最终还是通过 call.getVideoState() 获取当前的call是否是 videocall 来确定是否显示的,ViewStub本身是不可见的。
  • photoLarge,显示大头像占满整个下半部分。
  • voiceRecorderIcon,显示录音图标,显示在界面右边。
  • contact_context,包含一个 textview 和一个 listview,显示联系人交互信息,包括商业和个人,当 photoLarge 没有显示时才会显示这些信息。显示在整个下半部分。
Android 5.1 Lollipop Phone工作流程浅析(十三)__InCallActivity启动Performance浅析 Google在2015年3月9日低调发布了Android 5.1,从官方博客的描述来看只是进行了小幅更新,如增加多SIM卡支持,HD Voice支持等。虽然Google对外声称只是稳定性和性能上的微调,但在查看Telephony Phone相关代码后,Android 5.1在这一块的动作还是很大的。 阅读详情

相关推荐

Android 4.4 Kitkat Phone工作流程浅析(二)__UI结构分析

之前有分析过Android 4.2的InCallScreen结构(传送门),但后面Google发布了Android 4.4即Kitkat,遂决定以之前的文章为模板,重新整理并记录。在4.4中当有来电或去电时,显示给用户的界面如图1,在4.4之前称之为InCallScreen,但在4.4之后叫做InCallActivity。在4.4中我们调出的拨号盘界面,实际为DialtactsActivity并隶属于Dialer应用.

Keep Awake,Keep Studying,Keep Moving,Keep... 2万+

android 4.4 kitkat phone工作流程浅析,Android4.4KitkatPhone工作流程浅析(六) InCallActivity显示更新流程...

概述前面五篇文章,将Android 4.4 的MO/MT流程衔接了起来,同时包括了UI结构简单分析,以及RILJ的工作流程分析。本篇以及后续关于Phone的文章,主要是对前面MO/MT主线的补充和说明,用以完善整个MO/MT流程。 在整个MO/MT流程的分析过程中,遗漏了很多细枝末节,在弄清楚整个MO/MT的始末之后,便发现有一些疑问疑问,因此打算陆陆续续分析一些遗漏的细节。本篇文章的发起缘由很简...

weixin_36296063的博客 473

IncallUI分析

6,IncallUI IncallUI主要包括通话界面的显示和更新,通话信息的查询,以及简单的逻辑,例如,接听/挂断等等。 首先,当有来电时,一般会显示来电界面(InCallActivity)或者通知界面(StatusBarNotifier)。 StatusBarNotifier通知栏是利用NotificationManager来实现的,当然也会异步查询电话的相关信息并显示。 Dialer

Jack的博客 7111

Android Dialer源码分析之通话中主动显示IncallActivity

描述:当手机已经在通话中的时候,界面回到桌面,再打开Dialer app的时候,手机就会提示并让你确认到底你是想打开已经在通话界面还是不管正在通话中的电话而重新拨打新的通话。 假如此刻你想打开正在通话界面,这时候就不是简单的startActivity了,IncallActivity是只有有通话才能显示出来的,而且通话中的那些状态信息,也不是startactivity能搞定的。 当Dialtac...

csdnxialei的博客 1700

Android系统】拨号app

大部分还看不懂,只记录接触到的一些 Android N 通话界面_InCallActivity_Yigit_dev的博客-CSDN博客 android N 拨打电话流程(MO)_Yigit_dev的博客-CSDN博客 ------------------------------------- 平板上去掉了一些ui的功能 ------------ 打电话的ui对应的activity是com.android.incallui.InCallActivity 里面是fragment组成的...

John_chaos的博客 848

AndroidN去电流程中和InCallUI的交互(拉起界面过程分析)

  在分析android N拨打电话流程中分析了,从拨号盘到RIL.java的流程,没有分析拨号过程和UI的交互,这篇文章来说明,拉起InCallUI的过程.   在上篇文章中可以知道CallIntentProcessor中会通过processOutgoingCallIntent来调用CallManager的startOutgoingCall和NewOutgoingCallIntentBroad...

woshihongliu的博客 2416

Telephony基础之VoiceCall业务(InCallActivity启动)

首先明确,MO拨号到启动InCallUI界面会依次经过Dialer–&gt;Telecom service–&gt;InCallUI三部分。 在点击拨号盘拨号按钮后通过onClick()会进入DialUtils.startActivityWithErrorToast():DialpadFragment.java @Override public void onClick(View view) {

cornerOfHeart的博客 2156

android mo流程,android Telephony学习 --- 第六篇 android7.0 MO InCallActivity启动流程

我们先看下7.0启动InCallActivity时序图:android incall UI启动流程.png还记得上篇讲的*号标记的地方么,对CallIntentProcessor里调用CallsManager的startOutgoingCall方法,我们从这里开始分析:// Send to CallsManager to ensure the InCallUI gets kicked off be...

weixin_39600616的博客 394

InCallActivity 中speaker的开关控制

本文主要介绍介绍一下在Android6.0中,InCallActivity界面上控制speaker开关的一些逻辑和方法,可以让我们大体了解speaker的变化形式,对在通话过程中speaker变化有所了解。先来看看两张大图图一上图主要介绍了CallAudioManager这个类,最终会调用turnOnSpeaker这个方法去打开或者关闭speaker,上图主要画了涉及到调用turnOnSpeaker

Yigit_dev的博客 1505

android Telephony学习 --- 第六篇 android7.0 MO InCallActivity启动流程

我们先看下7.0启动InCallActivity时序图: 还记得上篇讲的*号标记的地方么,对CallIntentProcessor里调用CallsManager的startOutgoingCall方法,我们从这里开始分析: // Send to CallsManager to ensure the InCallUI gets kicked off before the broadcas...

tingsky9985的博客 1231

Android 7.0 通话界面(InCallUI)是怎么出来的。

InCallUI 最终的启动是在                packages\apps\Dialer\InCallUI\src\com\android\incallui\InCallPresenter.java           调用此函数启动的               public Intent getInCallIntent(boolean showDialpad, boole

大书童的博客 5528

Android O来电call流程

Version:1.0 StartHTML:0000000194 EndHTML:0000209014 StartFragment:0000024273 EndFragment:0000208974 SourceURL:file:///Y:\Desktop\学习\新建文件夹\%5bAndroid%20O来电call流程.docx Android O来电call流程 frameworkte...

weixin_40193331的博客 1422

Android Dialer源码分析之通话来电UI显示

Android Dialer源码分析之通话界面UI控制流程

csdnxialei的博客 4847

Android 7.0 挂断电话流程分析

Android 7.0 挂断电话流程分析

Venus 的博客 8064

Android 5.0 InCallUI

Android 5.0 对InCallUI界面进行了调整以适应Google的Material Design。   下面来看一下来电的界面:       在Android 5.0中,InCallUI加入了新的呈现方式即Immersive Mode,只要在非LockScreen界面来电,来电信息将显示为一个浮动通知。该通知是一个Heads-up类型的Notifica

LYJ的IT生活 3234

Android开发艺术探索学习-View的事件分发机制(二)

这节主要是透过源码来分析触摸事件是如何从Activity传递到View中。

chan1116的专栏 986

android通话】设备被叫通话过程中,设备灭屏,过30秒左右,辅助机讲话,测试机无声音

现象描述 【通话】设备被叫通话过程中,设备灭屏,过30秒左右,辅助机讲话,测试机无声音 开启QIT loglit后不可复现; 连接QXDM后不可复现,无法抓取相应log 问题分析 从上面描述看,已经无法导出有用的log信息,供上层来分析了 !!! 总的感觉时设备在屏灭一段时间后,进入了休眠状态。导致底层硬件出问题了。 由于驱动已经底层不懂,只能从上层来添加wake lock来尝试解决。 解决方案...

wangjicong_215的博客 556
上一篇: Android N Call 状态分析
下一篇: 实现UTF-8、UCS2编码和解码
Yigit_dev
博客等级 码龄11年 92粉丝 47原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值