android TeleComm Telephony Dialer之间的说明
安卓在5.0之后在TeleService和IncallUI之间多加了一层TeleComm,个人感觉是不想让IncallUI和Phone进程联系过于紧密,也便于其他通话方式的添加(不仅仅局限于通过电信运营商拨打传统电话),
拨号成功后,对方接听了此路通话,那么通话界面将更新当前通话中的通话状态,并开始通话计时,可以理解为:Modem——>RIL——>TeleService——>Telecom——>Dialer,一层一层上报通话状态为,“通话中....”,的消息处理和发送过程.
系统的分层
Dialer,Telecom和TeleService三大应用可以理解为:Dialer应用是普通的Android App应用,其运行进程的用户信息和进程信息,也能说明此问题;Telecom应用运行在system_service进程上,其进程用户名为system系统用户,说明他在运行在Android Framework框架层;TeleService应用运行的进程名是com.android.phone,用户名是radio,承载着Telephony Call协议栈,同样可以认为他运行在Android Framewrok框架层;最后RIL他运行在HAL(硬件抽象层)。
————————————————
版权声明:本文为CSDN博主「达帮主」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_35427437/article/details/102963199
上文出自:https://blog.csdn.net/qq_35427437/article/details/102963199
学习android的通讯模块Telephony,那么先看下其框架结构:
应用层:包含android的应用程序
应用框架层:也就是常说的framework,包含常用的API框架
系统运行层:包含c/c++核心库和HAL层等
核心层:包含TCP/UDP/IP,camera drivers等
Android Telephony业务跨越AP,BP,AP和BP之间的相互通讯。
Android系统运行于AP之上,Telephony运行在Linux Kernel之上的User Space空间。
BP software运行于BP,主要负责无线通信处理。
上文出自:https://blog.csdn.net/tingsky9985/article/details/79896296?spm=1001.2014.3001.5501
概述
VoiceCall就是我们通常所说的打电话是基于系统中Telephony框架的具体应用情景,Telephony中涉及的其他通讯功能有ServiceState(服务状态)、DataConnection(数据链接)、SMS(短信),这篇文章重点讲解Call(通话)
1.MO(Mobile Origination Call)主叫,操作流程:拨号,启动UI界面,更新通话状态;
2.MT(Mobile Termination Call)被叫,操作流程:响铃,启动UI界面,更新通话状态。
VoiceCall框架
VoiceCall是一个可以通话的手机功能,Android系统中的VoiceCall的组成结构主要由下面几部分构成
1.Dialer(IncallUI) 为用户交互操作提供UI界面
2.Telephony Service 封装了控制,查询Telephony等功能
3.Telephony Framework 提供通话各种功能调用和状态查询,负责上层和Modem的通信
4.RIL 负责拨号,Sip,package收发等基本操作
具体个模块详细信息请查看下表:
模块名称 | 模块路径 | 模块功能 |
---|---|---|
Dialpad | packages/apps/Dialer/ | 拨号盘 |
CallLog | packages/apps/Dialer/ | 通话记录。其中显示的信息是从数据库中读出来的。在通话结束时,会将Call的信息存储到CallLog数据库中。 |
InCallUI | packages/apps/Dialer/ | 通话中的画面显示,在Android原生设计中,该模块只处理界面相关的内容。 |
TeleService | packages/services/Telephony | TeleService Framework 和 TeleCom Framework沟通的介质。 |
CallSettings | packages/services/Telephony | 里面多数是增值服务(SS)的设置,设置的过程中,会向MODEM侧发请求。比如:呼叫转移(CF)。 |
TeleCom | packages/services/Telecomm | App侧维护Call,call的相关处理都在TeleCom中进行。 |
TeleService FW | frameworks/opt/telephony | 和RIL通信,完成Call的基本通话功能以及其他相关业务。 |
Telecom FW | frameworks/base/telecom | 确保TeleCom的独立性,减少TeleCom和其他模块的直接交互。 |
VoiceCall流程
主要代码介绍
在学习VoiceCall的流程之前,先总结一下通话流程中的主要代码分布和作用
路径 | 主要代码文件 | 代码功能介绍 |
---|---|---|
packages/apps/Dialer | DialpadFragment.java | 拨号盘界面 |
packages/apps/Dialer | InCallScreen.java | 通话界面(通话信息、状态显示,通话控制按钮) |
packages/services/Telecomm | NewOutgoingCallIntentBroadcaster.java | 接收CALL、CALL_PRIVILEGED、CALL_EMERGENCY类型的ACTION,发送ACTION_NEW_OUTGOING_CALL广播 |
packages/services/Telephony | PhoneApp.java | 创建Phone对象,控制耳机、蓝牙、感应器、背景灯和Call状态等 |
packages/services/Telephony | PhoneUtils.java | 通话控制辅助类 |
packages/services/Telephony | CallNotifier.java | 电话应用程序模块,用于侦听电话状态更改以及来自电话层的各种其他事件,并触发任何生成的UI行为(例如启动Incoming Call UI,播放通话音,更新通知,编写通话记录条目等) |
frameworks/opt/telephony | Phone.java | Phone对象的抽象接口 |
frameworks/opt/telephony | CallManager.java | 为PhoneApp提供了一个访问和控制调用的抽象层,负责Framework和APP层的交互 1.呼叫控制和操作,例如dial()和hangup()2.通道功能,例如CanConference()3.注册通知 |
frameworks/opt/telephony | CallTracker.java | 和RIL.java交互,发起Call相关请求、跟踪Call状态 |
frameworks/opt/telephony | ServiceStateTracker.java | 和RIL.java交互,跟踪服务状态变化,并发起相关消息通知,SIM卡注册服务,SIM卡状态,手机信号等功能 |
frameworks/opt/telephony | DcTracker.java | 和RIL.java交互,跟踪数据链接相关状态 |
frameworks/opt/telephony | RIL.java | 和RIL(native)交互,完成AT命令执行,Call状态更新 |
frameworks/base/telephony | TelephonyManager.java | 提供对设备上telephony services信息的访问 |
hardware/ril | ril.cpp | native层的RIL环境 |
hardware/ril | rild.c | RILD守护进程 |
上文出自:http://blog.hsujee.com/2018/08/08/Android/Tele/2018-08-08-Telephony%E8%A7%A3%E6%9E%90%E4%B9%8BVoiceCall/
在我的概念里,Telephony 是从 GsmcdmaPhone 这一对象开始往下算起,才算是 Telephony 层。实际上 Telephony 的概念,它还包括这三个部分,一直以为是 Call App 的模块:
/packages/services/Telephony ==> TeleService.apk
/packages/services/Telecomm ==> Telecomm.apk
/frameworks/base/telecomm ==> Telecomm FW
上面这三个部分,都算是 Telephony;在这个概念里, Call App UI 才算是上层 app 模块。
/packages/apps/Dialer/java/com/android/incallui ==> InCallUI
这篇文章,从框架上讲解一下这三个模块的关系,并整理一下来电的流程,熟悉他们的调用关系。
只谈框架流程,不聊具体细节。
架构
先上一张图,从大体上看他们的调用关系。
如上图所示,
TeleService <==> Telephony Framework PhoneBase;TeleService 和 framework 进行交互;
TelecommService/Telecomm FW <==> TeleService , TeleService 和 InCallUI 交互要经过 Telecomm 层;
InCallUI <==> TelecommService/Telecomm FW 交互;
这就是基本的架构,要清楚知道交互消息是如何传输的, 看起来是 Telecomm 起着中间桥梁的作用。
Telephony 主要的类
TeleService 中的 TelephonyConnection 监听来自 PhoneBase 的 call 状态变化,并通过 connectionService 相关的类(ConnectionServiceWrapper) 向 Telecomm 传递状态信息;
Telecomm 到 InCallUI 的过程,则是由 CallsManager 向 InCallController 传递,最后通过 InCallServiceImpl 向 InCallUI 传递。
中间各层 call 的转化,需要经过 Telecom FW.
Telephony 中主要的 Service
开机加载 TelecommServiceImpl(TelecommManager), 创建 CallsManager 和 InCallController;同时创建 PhoneAccount,监听来电信息;
来电,创建 TelephonyConnectionService, 创建 TelephonyConnection 监听 Call 状态变化;
CallsManager 回调 InCallController, 告知 InCallService, 最终更新到 InCallUI.
上文出自:https://blog.csdn.net/amd123456789/article/details/95720378
android TeleComm Telephony Dialer之间的说明相关推荐
- android fragment传递数据,Android 两个Fragment之间传递数据实例详解
Android 两个Fragment之间如何传递数据 FragmentA启动FragmentB,做一些选择操作后,返回FragmentA,需要把FragmentB里面选择的数据传回来.有什么办法? F ...
- android linux网络连接,Android和Linux服务器之间的TCP连接
我正在编写一个代码,需要每秒从Android移动设备向台式计算机(linux服务器)发送数据.由于数据经常发送,通过Http命中无法实现(因为会消耗时间),所以Tcp通信似乎是更好的选择,因为andr ...
- (转载) Android两个子线程之间通信
Android两个子线程之间通信 标签: classthreadandroid子线程通信 2015-03-20 17:03 3239人阅读 评论(0) 收藏 举报 分类: 个人杂谈 版权声明:本文为 ...
- android 数据业务,【Android架构Telephony篇】之数据业务(一)
Android: 4.4.4 Desktop: Ubuntu 15.04 这里只做一些准备事情. 不得不说,Android里的Telephony模块还是挺复杂的,要想搞个八九分清楚需要花点功夫.今天把 ...
- Android更新圆点代码,Android实现两圆点之间来回移动加载进度
本文实例为大家分享了Android实现两圆点之间来回移动加载进度的具体代码,供大家参考,具体内容如下 一.前言 最近喜欢上自定义控件,喜欢实现一些简约有趣的控件,也好巩固下以前学得知识和不断的学习新知 ...
- 《深入理解Android:Telephony原理剖析与最佳实践》一1.3 Android Telephony框架结构...
1.3 Android Telephony框架结构 前面对Android手机操作系统整体框架结构及每一层进行了简单的分析和说明,相信大家对Android智能手机操作系统有了一些基本的了解和认识.结合前 ...
- android脚步---不同界面之间切换
对于一个app,可能需要多个界面,使用Button或者其他控件在不同界面之间切换,那么如何做到呢 首先必须明确,一般一个activity.java文件一般只对应一个界面即一个layout.xml文件, ...
- Android客户端与服务器之间的通信
本文将介绍Android客户端与服务器端的通信的简单实现方法. 要两点需要注意的地方: 1.Android 端记得在AndroidManifest.xml里记得获取一下网络权限,否则无法进行网络通信, ...
- 《深入理解Android:Telephony原理剖析与最佳实践》一1.1 智能手机的系统结构
1.1 智能手机的系统结构 Android手机的基本硬件结构是符合智能手机的基本硬件结构,我们要学习Android移动开发,首先需要了解智能手机的硬件系统基本结构. 随着通信领域的快速发展,移动终端发 ...
最新文章
- 570D Codeforces Round #316 (Div. 2) D(dfs序,时间戳,二分
- html静态页面到jsp文件css错误
- 浅谈移动Web开发:深入概念
- 知识点:图说 Mysql 权限管理
- 华为P7电信4G版刷机包 EMUI2.3 官方B125 第3版 精简 ROOT
- C# EF6 更新对象
- C++课设——药品管理系统
- Java 创建一个Customer类,类中的属性有姓名、年龄、性别,然后创建两个Customer对象,把这两个对象存储在ArrayList对象中,然后再从ArrayList对象中读取出来。
- 国潮风格设计,具象化插画作品|打开你的头脑风暴
- 弘辽科技:店铺前期可以不上宝贝吗?店铺如何上宝贝?
- .NET平台机器学习资源汇总,有你想要的么?
- 英伟达发布528.02 WHQL 新驱动,支持4070 Ti
- 汽车网络安全风口渐起,诚迈科技与Trustonic牵手“发力”
- 从零开始写游戏引擎(一) - 工程创建以及目录设置还有版本控制
- Gunicorn 部署flask-socketio项目,项目访问慢的问题
- C语言结构体作为形参
- excel最强教科书电子版_Excel最强教科书(完全版全彩印刷)
- you-get下载神器的安装和使用
- 181216 MacOs上如何将多页PDF文件合成打印在一张PDF表单上面
- Metal每日分享,虚假颜色混合滤镜效果