`
jgsj
  • 浏览: 1058434 次
文章分类
社区版块
存档分类
最新评论

Android Phone模块 一

 
阅读更多
电话管理是Android系统支持的重要的业务之一,提供接听电话,收发短信、电话薄、网络事件监听、读取用户信息等功能。

从下到上可以分为四层:硬件驱动层、RIL daemon层、Telephony框架实现层、PHONE应用层,下层为上层提供服务,每层之间采用不同的通讯方式交互。RIL daemon层实现为单独的一个开机启动的进程(rild命令),通过AT命令硬件驱动层交互,TelephonyJAVA框架实现层包括一个RIL抽象层,RIL抽象层中通过一个本地socket与RIL daemon层(rild)交互,Phone应用层通过Binder机制与Telephony框架交互。

本文主要分析框架层相关的主要类的结构。

一Telephony框架

Telephony框架系统类图如下图:


Telephony框架层为应用层和框架层的其它服务提供Telephony服务,提供了如下几个服务:PhoneInterfaceManager服务,是ITelephony接口的实现,IccSmsInterfaceManager短消息服务,是Isms接口的实现;IccPhoneBookInterfaceManager电话本服务,是IIccPhoneBook接口的实现;PhoneSubInfo提供用户信息读取服务,是IPhoneSubInfo接口的实现;TelephonyRegistry提供应用层的消息登记服务,是ITelephonyRegistry接口的实现。

应用程序通过以下几个客户端对象使用Telephony框架提供的服务。

应用程序可以在SmsManager单例对象(通过SmsManager类的getDefault函数返回SmsManager单例对象)中访问IccSmsInterfaceManager服务,用来收发短信。

通过IccProvider一个内容提供对象提供对IccPhoneBookInterfaceManager服务的访问,读取和管理电话本。

通过TelephonyManager对象提供对PhoneSubInfo、PhoneInterfaceManager、TelephonyRegistry服务的访问,TelephonyManager对象通过getSubscriberInfo函数获得PhoneSubInfo服务的远程访问代理对象。通过getITelephony函数获得PhoneInterfaceManager的远程访问代理对象。提供一个对象全局sRegistry(指向TelephonyRegistry服务的远程访问代理对象)访问TelephonyRegistry服务。

TelephonyManager通过这三个接口函数提供对外的TelephonyAPI,因此应用程序可以通过TelephonyManager对象提供的TelephonyAPI访问这些服务,使用Telephony框架层提供的接口功能。

TelephonyManager对象本身通过Context对象调用getSystemService(Context.TELEPHONY_SERVICE)函数返回,TelephonyManager对象是一个单例对象。

PhoneInterfaceManager服务在默认电话应用的PhoneApp对象中采用单例模式进行初始化(PhoneApp对象本身也是单例对象),和PhoneApp对象公用一个进程,PhoneInterfaceManager为框架层的其它服务提供Telephony API服务,并通过TelephonyManager对象(通过getITelephony函数获得ITelephony接口)为其它应用提供服务。PhoneInterfaceManager通过PhoneApp、CallManager、Phone对象实现相应功能。CallManager是一个单例对象,CallManager对象提供CALL控制以及登记通知等功能。

Phone对象是整个Telephony服务的核心,主要的Telephony服务(IccSmsInterfaceManager、IccPhoneBookInterfaceManager、PhoneSubInfo)及数据连接功能都通过具体的Phone对象提供,具体的Phone对象包括CDMAPhone、CDMALTEPhone、GSMPhone及SipPhone。

PhoneBase抽象类是这些具体Phone对象的共同的基类,本身一个Handler类,用来提供Phone接口的基实现,PhoneBase通过CommandsInterface接口与RIL daemon层交互,实现短消息提交、数据连接控制、ICC信息读取等Telephony基类功能。PhoneBase包含SMSDispatcher、DataConnectionTracker、IccFileHandler、IccRecords、IccCard等几个抽象类成员,并通过这些抽象类成员提供某一方面功能的基类实现。

SMSDispatcher、DataConnectionTracker、IccFileHandler、IccRecords抽象类也是派生自Handler类,因此都能够向RIL发送命令,接收和处理RIL发来的事件和命令应答。PhoneBase包括一个PhoneNotifier接口,Phone对象本身及内部对象可以通过PhoneNotifier接口向应用发送Telephony事件通知。

CDMAPhone、GSMPhone、CDMALTEPhone三个具体的Phone对象在默认的PhoneApp应用中调用PhoneFactory的makeDefaultPhone函数根据不同的网络模式进行单例实例化,并封装进一个统一的PhoneProxy代理对象中。

sCommandsInterface = new RIL(context, networkMode, cdmaSubscription);
int phoneType = getPhoneType(networkMode);
if (phoneType == Phone.PHONE_TYPE_GSM) {
    sProxyPhone = new PhoneProxy(new GSMPhone(context,sCommandsInterface, sPhoneNotifier));
} else if (phoneType == Phone.PHONE_TYPE_CDMA) {
    switch (BaseCommands.getLteOnCdmaModeStatic()) {
        case Phone.LTE_ON_CDMA_TRUE:
        		sProxyPhone = new PhoneProxy(new CDMALTEPhone(context,sCommandsInterface, sPhoneNotifier));
            break;
        case Phone.LTE_ON_CDMA_FALSE:
        default:
            sProxyPhone = new PhoneProxy(new CDMAPhone(context,sCommandsInterface, sPhoneNotifier));
            break;
    }
}

PhoneProxy内部的对象成员mActivePhone指向代理的实际Phone对象。PhoneProxy代理对象实现了Phone接口,使应用能够使用统一的PhoneProxy对象控制操作具体类型的Phone对象,而不用关心它们之间的差异(代理模式的采用),应用程序通过PhoneFactory的getDefaultPhone函数返回统一的PhoneProxy代理对象来访问不同的Phone对象。

因为Telephony框架层支持不同的网络类型的Telephony实现(CDMA、GSM),因此Telephony框架层普遍使用代理模式来对应用提供统一的服务接口。如PhoneProxy代理对象内部还封装了IccSmsInterfaceManager、IccPhoneBookInterfaceManager、PhoneSubInfo三个服务的代理对象,通过代理对象提供对这三个服务的操作控制。

public PhoneProxy(Phone phone) {
    mActivePhone = phone;
    mIccSmsInterfaceManagerProxy = new IccSmsInterfaceManagerProxy(phone.getIccSmsInterfaceManager());
    mIccPhoneBookInterfaceManagerProxy = new IccPhoneBookInterfaceManagerProxy(phone.getIccPhoneBookInterfaceManager());
    mPhoneSubInfoProxy = new PhoneSubInfoProxy(phone.getPhoneSubInfo());
    mCommandsInterface = ((PhoneBase)mActivePhone).mCM;
}

另外CommandsInterface接口的具体实现对象RIL及PhoneNotifier接口的具体实现对象DefaultPhoneNotifier也是在PhoneFactory的makeDefaultPhone中进行单例实例化。

CDMAPhone、GSMPhone对象直接派生自PhoneBase,提供Phone接口的具体实现,GSMPhone是GSM电话的JAVA框架层实现,CDMAPhone是CDMA电话的JAVA框架层实现。

CDMAPhone、GSMPhone对象实例化时除实例化基对象PhoneBase内部抽象对象(SMSDispatcher、DataConnectionTracker、IccFileHandler、IccRecords、IccCard)的具体类外,还实例化用于具体电话对象的Telephony服务(IccSmsInterfaceManager、IccPhoneBookInterfaceManager、PhoneSubInfo三个服务或者服务的派生类)。

二GSMPhone

如下是GSMPhone对象的相关类图。

SMSDispatcher、DataConnectionTracker、IccFileHandler、IccRecords、IccCard等抽象类对应GSMPhone对象中的派生类分别为GsmSMSDispatcher(提供GSM模式的短消息发送和接收提交功能)、GsmDataConnectionTracker(提供GSM模式的数据连接管理功能)、SIMFileHandler(提供SIM File处理)、SIMRecords(提供SIM信息记录功能)、SimCard(提供SIM CARD功能);

IccSmsInterfaceManager、IccPhoneBookInterfaceManager、PhoneSubInfo服务在GSMPhone对象中实现的具体的服务类为SimSmsInterfaceManager、 SimPhoneBookInterfaceManager及PhoneSubInfo;这些对象和服务都在CDMAPhone对象实例化进行实例化。

另外GSMPhone对象在实例化时还实例化GsmCallTracker(提供GSM模式的CALL管理)、GsmServiceStateTracker(提供GSM模式的服务状态管理)、CatService对象(提供STK服务)。

mCT = new GsmCallTracker(this);
mSST = new GsmServiceStateTracker (this);
mSMS = new GsmSMSDispatcher(this, mSmsStorageMonitor, mSmsUsageMonitor);
mIccFileHandler = new SIMFileHandler(this);
mIccRecords = new SIMRecords(this);
mDataConnectionTracker = new GsmDataConnectionTracker (this);
mIccCard = new SimCard(this);

if (!unitTestMode) {
    mSimPhoneBookIntManager = new SimPhoneBookInterfaceManager(this);
    mSimSmsIntManager = new SimSmsInterfaceManager(this, mSMS);
    mSubInfo = new PhoneSubInfo(this);
}
mStkService = CatService.getInstance(mCM, mIccRecords, mContext, mIccFileHandler, mIccCard);

GSMCallTracker是Android的通话管理层,GsmCallTracker派生自Handler的虚拟类CallTracker;GsmServiceStateTracker派生自Handler的虚拟类ServiceStateTracker。

GsmCallTracker、GsmServiceStateTracker对象分别提供Call状态(共有IDLE, ACTIVE, HOLDING, DIALING, ALERTING, INCOMING, WAITING, DISCONNECTED, DISCONNECTING九种状态)及ServiceState(共有STATE_IN_SERVICE、STATE_OUT_OF_SERVICE、STATE_EMERGENCY_ONLY、STATE_POWER_OFF四种状态)的跟踪和管理,能够提供向RIL层发送请求,接收和处理RIL层发来的命令响应事件及其它主动通知事件,如振铃等CALL相关事件及Service状态事件。

GsmCallTracker对象中还提供有三个GsmCall对象(派生自抽象类Call):ringingCall(用来管理处于INCOMING和WAITING状态的通话)、foregroundCall(用来管理处于DAILING、ALERTING、ACTIVE状态的通话)、backgroundCall(用来管理HOLD的通话)。

GsmCallTracker是Call应用中的通话管理层,它维护了一个最多MAX_CONNECTIONS=7路GsmConnections通话链路的同时,还维护了三种通话状态(ringingCall,foregroundCall,backgroundCall),GsmCall以及GsmConnection是GsmCallTracker维护的对象,同时GsmConnection又依附于GsmCall的存在,MAX_CONNECTIONS_PER_CALL=5表明最多可以有5路通话处于某一个通话状态(foregroundCall,background,ringing)。GsmConnection继承自Connection类,该类主要是用来维护某一路的通话状态。当它们状态均为DISCONNECTED时意外着该GSMCall为IDLE状态。


在GSMCallTracker中维护着通话列表:connections。顺序记录了正连接上的通话,这些通话包括:ACTIVE,DIALING,ALERTING,HOLDING,INCOMING,WAITING等状态的连接。GSMCallTracker将这些连接分为了三类别进行管理:RingingCall: INCOMING ,WAITING ForegourndCall: ACTIVE, DIALING ,ALERTING BackgroundCall: HOLDING


另外GSMCallTracker还包含一个GsmConnection类型(派生自抽象类Connection)的数组对象Connections,用来维护所有的现行的通话的列表,GSMCallTracker对象最大可维护7路通话。

GsmConnection对象中有个成员变量:GsmCall parent,这个成员变量是用来表示该connection是属于哪个Call的,一个Call可以有多个Connection,但一个Connection只能属于一个Call。

GsmServiceStateTracker对象中除了包括ServiceState状态信息外,还包括SignalStrength信号强度等信息。

GsmServiceStateTracker对象还维护GSM CELL位置信息,因此包含两个GsmCellLocation对象成员cellLoc(当前位置) , newCellLoc(新位置)。

GsmCallTracker、GsmServiceStateTracker维护的状态和位置信息都通过RIL从RIL daemon获得,因此两个对象都包括一个指向RIL的CommandsInterface对象。

CatService对象实现STK服务,也是一个Handler对象,并实现AppInterface接口。CatService对象能够与RIL和STK应用交互:可以实现向RIL发送Envelop命令,以及从RIL接收STK事件,解析事件流(包括Proactive Command),从STK应用接收命令执行结果编码后发给RIL。CatService对象采用一个RilMessageDecoder状态机解析RIL发来的STK事件流。

拨打电话(dial)


它首先clearDisconnected()和canDial()清空过去的非连接状态的Connections,然后检查是否可以拨打电话。接着检查foregroundCall是否处于Active状态,若是则调用switchWaitingOrHoldingAndActive将它们切换到后台,调用fakeHoldForegroundBeforeDial将前台中的连接全部切换到后台,并且状态变为HOLDING。在进行这些前期检查和准备后,创建一个GsmConnection实例即pendingMO,检查传递过来的电话号码是否有效合法,若不合法则调用pollCallsWhenSafe(),目的是将其标为dropped;若合法则设置为非静音后,调用RIL.dial进行拨号。最后,更新Phone状态并通知给注册者。

PhoneInterfaceManager@call

PhoneUtils@placeCall

CallManager@dial

GSMPhone@dial

GsmCallTracker@dial

RIL@dial

接听电话(acceptCall)


若ringingCall正处于INCOMING则调用RIL.acceptCall去接听电话;若是WAITING状态,则调用switchWaitingOrHoldingAndActive将其切换到前台。

PhoneInterfaceManager@answerRingingCall

PhoneUtils@answerCall

CallManager@acceptCall

GSMPhone@acceptCall

GsmCallTracker@acceptCall

RIL@acceptCall

拒接电话(rejectCall)


当ringingCall处于INCOMING时,则调用RIL.rejectCall拒绝;否则抛出异常,表示没有来电却去接听它。

CallManager@rejectCall

GSMPhone@rejectCall

GsmCallTracker@rejectCall

RIL@rejectCall

挂断电话(hangup)


它区分是ringingCall、foregroundCall还是backgroundCall。若是ringingCall,则调用RIL.hangupWaitingOrBackground;若是foregroundCall,并且是在DIALING或ALERTING状态则调用调用hangup (GsmConnection conn)挂断,否则调用hangupForegroundResumeBackground挂断前台通话后恢复后台通话;若是backgroundCall且ringingCall在响铃,则调用hangupAllConnections挂断所有在backgroundCall的通话连接,否则调用hangupWaitingOrBackground挂断呼叫等待和后台通话。

PhoneInterfaceManager@endCall

PhoneUtils@hangup

CallManager@hangupForegroundResumeBackground

GsmCall@hangup

GsmCallTracker@hangup

RIL@hangupWaitingOrBackground


switchWaitingOrHoldingAndActive():进行电话切换
conference():进行电话会议
separate():分离出一路通话
fakeHoldForegroundBeforeDial()将前台电话(ForegroundCall)中的电话连接(GSMConnections)clone后台后,将这些连接删除,将Foreground置为IDLE状态,将后台电话BackgroundCall置为HOLDING状态。
clearDisconnected():清除已Disconnected的电话连接并更新电话状态,然后通知注册者当前最新的状态。
internalClearDisconnected():将ringingCall、 foregroundCall和 backgroundCall中状态为DISCONNECTED的 connections清除掉,若没有connection则将该GSMCall置为idle状态。
updatePhoneState():更新Phone状态,并向注册者通知语音通话开始或结束。
canDial():检查是否可以拨打电话,只有同时满足下列条件才可以:(1)射频Raido未关闭(2)PendingMO这个Connection为空(3)RingCall这个GSMCall未处于响铃状态(4)系统没有禁止电话拨打功能(5)ForegroundCall和BackgroundCall这2个GSMCall都不处于活动状态。其中当为INCOMING 和WAITING表示在响铃;当为DIALING 和 ALERTING时 表示在拨号;当不为IDLE 、 DISCONNECTED 和DISCONNECTING时表示活动状态,即处在上述的响铃、拨号、ACTIVE 和HOLDING时表示处于活动状态。
canConference():当ForegroundCall处于Active、BackgroundCall处于HOLDING以及它们的连接数少于5个时则可进行电话会议
canTransfer():当ForegroundCall处于Active、BackgroundCall处于HOLDING时则可进行交换。
hangup (GsmConnection conn):挂断某路电话连接
hangupWaitingOrBackground():挂断呼叫等待和后台电话
hangupForegroundResumeBackground():挂断前台电话并恢复后台电话
hangupConnectionByIndex(GsmCall call, int index):挂断某个索引指定的前台通话
hangupAllConnections(GsmCall call):挂断所有电话通路
分享到:
评论

相关推荐

    深入解析Android phone模块

    ### 深入解析Android Phone模块 ...总结而言,Android Phone模块涉及的技术细节非常广泛,从底层的硬件通信到上层的应用程序逻辑,每一环节都至关重要。深入理解这些技术细节对于开发高质量的移动应用具有重要意义。

    android_phone_模块分析

    在Android Phone模块中,发送AT命令是一个常见的操作。AT命令用于与调制解调器(Modem)通信,控制其行为或获取信息。下面详细介绍发送AT命令的流程。 1. **应用程序启动**:应用程序通过设置`android:process=...

    Android4.2 Phone 电话模块源码

    1. **电话服务(Telephony Service)**:这是Phone模块的核心部分,负责与底层硬件(如基带处理器)交互,执行通话、短信、数据连接等任务。在源码中,我们可以找到`PhoneBase`类作为所有电话服务的基类,以及针对...

    Android Phone模块总结(附有Contacts模块)

    在Android操作系统中,Phone模块是核心组件之一,负责处理电话相关的功能,包括拨打电话、接听电话、管理联系人等。Contacts模块则是用户与联系人数据交互的主要界面,它允许用户查看、编辑和呼叫联系人。本文将对这...

    Android_Phone框架介绍(以GsmPhone为例

    Android Phone 框架是 Android 系统中负责处理电话功能的关键组件之一,包括但不限于电话呼叫管理、短信处理以及网络连接状态监测等功能。本文将从以下几个方面进行阐述: 1. **Phone App 的启动机制** 2. **...

    MT65xx Android Phone、Preloader 驱动

    1. MT65xx Android Phone驱动 Android Phone驱动是Android系统中用于与MT65xx处理器交互的核心组件。它包括了对CPU、内存、I/O端口、显示控制器、音频编解码器等硬件模块的驱动程序。这些驱动程序允许操作系统读取和...

    Android phone 框架介绍

    Android Phone 模块作为整个 Android 系统中至关重要的组成部分,主要负责处理电话相关的功能和服务,包括但不限于接听、拨打电话、短信处理等。本章节将从总体框架出发,详细介绍 Android Phone 的各个组成部分。 ...

    Android电话模块分析.pdf

    Android 电话模块是 Android 系统中的一部分,负责处理电话相关的事件和信息。电话模块的主要组件包括 Phone 应用、Telephony 框架层和 CallManager。 Phone 应用是 Android 系统中的一个核心应用,负责处理两种...

    Android 电话流程过程详细分析(Phone模块 )

    ### Android 电话流程过程详细分析(Phone模块) #### 一、Phone电话过程分析 本章节主要探讨Android系统中电话服务的实现原理以及电话流程的工作机制。为了更好地理解这些概念,我们首先需要明确几个核心概念: ...

    android系统模块源码

    Phone模块是Android电话服务的核心,负责处理拨打电话、接听、挂断以及通话状态的管理。源码中包含了PhoneService、CallManager和RIL(Radio Interface Layer)等关键组件,它们与底层通信硬件紧密交互,提供了丰富...

    android4.0 电话Phone源代码

    Android 4.0(Ice Cream Sandwich,简称ICS)时期的Phone模块源代码为我们提供了一个深入了解Android电话系统内部运作的窗口。下面我们将深入探讨这个模块的主要组成部分、工作原理及其相关知识点。 1. **Phone服务...

    Android应用源码之Phone.zip

    本篇文章将围绕"Phone.zip"这一压缩包,详细解析其中蕴含的Android应用源码相关知识点,帮助读者深入理解Android系统的电话功能实现。 首先,Phone.zip中的源码通常包含了Android系统中与电话功能相关的组件和服务...

    android phone流程

    1. **Android RIL 框架概述** - RIL 是一个抽象层,位于应用程序框架与内核之间,分为两部分:`rild` 和 `Vendor RIL`。 - `rild` 是一个守护进程,通过 Unix socket 与应用程序框架通信,处理上层请求。 - `...

    android phone 电话源码

    在Android系统中,电话功能是其核心组件之一,它使得移动设备能够进行语音通信和数据交换。Android 4.0(代号Ice Cream Sandwich)是一个重要的版本更新,它对电话功能进行了诸多优化和改进。本篇文章将深入探讨...

    android phone网上资料

    5. **android_phone_模块分析:** 这个文档可能深入探讨了Android手机的不同组件或模块,如硬件接口、系统服务、应用程序框架等,帮助开发者理解和优化整个系统的性能。 6. **android--ril:** RIL(Radio ...

    android 联系人模块例子

    这个“android 联系人模块例子”提供了一个全面的学习资源,尤其适合初学者理解如何在Android应用中操作和展示联系人数据。下面我们将深入探讨这个话题,了解Android联系人API的使用以及如何构建联系人管理模块。 ...

    安卓Android源码——Phone.rar

    在Android系统中,Phone模块是核心组件之一,它负责处理手机相关的通信功能,包括拨打电话、接收来电、短信服务等。深入理解Phone模块的源码有助于开发者更好地定制系统服务,优化通信性能,或者开发与电话功能相关...

    Android手机通讯录导入iPhone教程

    1. **Android端安装与设置** - 确保Android手机已安装YY备份,若未安装,需下载并安装此应用。 - 打开YY备份,首次使用需注册账号,输入手机号与密码完成注册流程。 - 登录后,进入“联系人”模块,点击备份按钮...

    Android 通话模块来电和去电流程分析

    ### Android 通话模块来电与去电流程分析 #### 一、引言 在现代移动通信技术中,Android作为全球...以上就是对Android系统通话模块来电和去电流程的一个较为全面的分析,希望能够帮助开发者更好地理解这一复杂的流程。

Global site tag (gtag.js) - Google Analytics