Android视频通话应用设计

背景

以下内容基于Android N code。

本文会从应用框架、进程交互、流程几个方面,讲解Android手机中视频通话的应用层设计。

应用框架设计

Android电话模块是一个典型的分层结构设计,视频电话在语音通话结构的基础上增加了一些类,但仍遵循原本的分层结构,如下:

分层结构

可以看到,相较于语音通话,视频通话主要增加了以下内容:

在Application层的Telecom应用增加了VideoProviderProxy类,InCallUI增加了一个控制显示视频电话界面的MVP结构。

Framework层的telecom模块增加了VideoCall及VideoProvider,分别为视频电话call的信息存储者和控制者。同时Framework层的telephony模块增加了视频电话相应的Phone、Call、Connection和CallTracker。另外增加了net模块,该模块负责和telephony进行拨号、来电、通话状态变更等通话相关操作的交互,和telecom进行camera、surface等media相关方面的交互。

原本Framework的telephony和RIL层进行交互,改成了Framework的telephony和net进行交互,net模块再和vendor里面的ims模块交互,ims再负责和modem、media进行交互。这一部分的代码虽然都按照google提供的接口实现,但各个芯片厂家的具体实现方式都不一样。

由于要显示视频界面,增加了media层负责设置视频通话的Camera、Surface等操作和信息反馈。视频通话和modem、media层的交互过程都封装在vendor/ims层。

应用间进程交互

进程交互方式

相较于语音通话,主要增加了phone进程和ims进程的交互,之前phone进程和RIL、modem的交互,也改成了ims和modem的交互。

如图:

进程交互

Binder交互过程

其交互过程具体如下:

binder 交互

及InCallUI<->phone<->telecom<->ims,如果用户在界面操作了挂断电话或切换相机的操作要通话telecom、phone进程的两层中转到ims进程,ims再具体下发到modem或者media,反之有消息要传到通话界面也是从ims通话phone和telecom两进程的中转到InCallUI。

具体交互细节如下:

进程交互结节

Phone进程通过ServiceManager.getService(“ims”)拿到沟通ims进程的桥梁。

值得注意的是phone进程和telecom进程分别创建了一个VideoProvider,phone进程的VideoProvider负责phone进程和telecom进程的沟通,telecom进程的VideoProvider负责telecom进程和incallui进程的沟通。

通话流程

因为是分层结构,和语音通话一样来电、挂断是从上到下,而来电和电话状态的变化则是从下到上。

拨号流程

拨号是从上往下,即从APP到FW到ims再到Modem和media。

如下图:

拨号流程

拨号盘通过TelecomManager的接口拨号,并带有VideoState为RX或TX或RX&TX的intent参数,telecom一边向phone进程请求拨号,一边通知incallui显示拨号界面。和语音通话不通的是语音通话是通过GsmCdmaPhone向RIL再向modem发送拨号请求,而视频电话是通话ImsPhone向ims再向modem发送拨号请求。另外视频通话增了向media设置camera、本机预览surface和对端画面surface的过程。

电话状态更新流程

电话状态更新和语音通话一样,从结构上看是从下往上,通过一层层的监听和通知通过观察者模式从Modem通知到RIL到FW到APP。

如下图:

ImsPhoneCallTracker在拨号或者来电创建新的ImsCall时同时会通话ImsCall向ims的IImsCallSession的实现者注册listener,当有状态变更时modem传到ims,ims再通过ImsPhoneCallTracker向其注册的listener通话到ImsPhoneCallTracker,之后状态的传替和语音通话一样。

来电流程

和语音通话不同的是,来电信息由modem通过socket传到RIL再通过binder传到phone,变成了modem通过socket传到ims,ims再发广播通知位于phone进程的ImsPhoneCallTracker。

开机后phone进程起来会根据手机的待机模式构建GsmCdmaPhone,每个phone都会监听ims

service的状态变更,一旦ims可用该GsmCdmaPhone就会创建一个属于自己的ImsPhone,而这个ImsPhone同样会创建为自己管理通话的ImsPhoneCallTracker,用其来拨号和接收来电广播。


原创内容欢迎转载,但请注明出处,谢谢!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 目录 Android通话应用设计 1 一、 背景 1 二、 应用框架设计 1 三、 常驻进程开机唤醒 2 1. P...
    朱兰婷阅读 7,818评论 4 25
  • 1. 应用进程 从点击拨号按钮流程说起packages/apps/Dialer/src/com/android/d...
    小的橘子阅读 4,308评论 3 1
  • 拨号流程 概述:拨号的过程,如果按照进程来分,可以分成3个模块。 com.android.dialer进程,即电话...
    SevChen阅读 2,904评论 4 2
  • 一、telecom进程和bluetooth进程的交互方方式 1. telecom进程主动控制蓝牙的操作是通过跨进程...
    朱兰婷阅读 8,802评论 1 12
  • 这篇文章介绍一下机器学习算法的分类和算法的特点,我们一般把机器学习算法分为监督学习、非监督学习、半监督学习、强化学...
    吕不韦阅读 868评论 0 3