1 frameworks/base/telephony/java/android/telephony/cdma为使用CDMA具体的电话功能提供的API。
1.1) CdmaCellLocation是CellLocation的直接派生类,表示了一个CDMA手机通话的位置。
CDMA(Code Division Multiple Access)又称码分多址,是在无线通讯上使用的技术,CDMA 允许所有的使用者同时使用全部频带(1.2288Mhz),并且把其他使用者发出的讯号视为杂讯,完全不必考虑到讯号碰撞 (collision) 的问题。 CDMA的优点包括: CDMA中所提供的语音编码技术,其通话品质比目前的GSM好,而且可以把用户对话时周围环境的噪音降低,使通话更为清晰。
2 frameworks/base/telephony/java/android/telephony/gsm为使用GSM具体的电话功能提供的API,例如文字、数字、PDU短信。
2.1) GsmCellLocation是CellLocation的直接派生类,表示了一个GSM手机通话的位置。
GSM全名为:Global System for Mobile Communications,中文为全球移动通讯系统,俗称"全球通",是一种起源于欧洲的移动通信技术标准,是第二代移动通信技术,其开发目的是让全球各地可以共同使用一个移动电话网络标准,让用户使用一部手机就能行遍全球。目前,中国移动、中国联通各拥有一个GSM网,为世界最大的移动通信网络。包括 GSM 900:900MHz、GSM1800:1800MHz 及 GSM1900:1900MHz等几个频段。
2.2) SmsManager管理短信操作,如发送数据,文本和PDU的短信。通过调用静态方法SmsManager.getDefault()获得这个对象。被同时支持GSM和CDMA的android.telephony.SmsManager取代。
2.3) SmsMessage一个短消息服务信息。被同时支持GSM和CDMA的android.telephony.SmsMessage取代。
3 frameworks/base/telephony/java/android/telephony为手机基本信息提供的API(应用程序编程接口),包括网络类型、连接状态、电话号码字符串处理的实用程序。
3.1) CellLocation代表设备位置的抽象类。有两个派生类:CdmaCellLocation和GsmCellLocation。
3.2) JapanesePhoneNumberFormatter处理日本电话号码复杂的格式。
3.3) NeighboringCellInfo实现Parcelable接口,代码邻近的电话信息,包括信号接受强度和电话ID位置。
3.4) PhoneNumberFormattingTextWatcher实现TextWatcher接口,检测一个文本输入框,如果输入了电话号码,则将它通过PhoneNumberUtils的formatNumber函数格式化。该格式化是基于当前系统,将来对象被创建和语言环境变换并没有影响到这个实例。
3.5) PhoneNumberUtils处理电话号码字符串的各种实用程序。
3.6) PhoneStateListener是监测设备上特定电话状态变化的监听类,包括服务的状态,信号强度,消息等待指示(语音信箱)等。对状态进行方法重写,以至于接受更新。并且通过你的 PhoneStateListener对象, 与带LISTEN_标志的变量按位或。一些电话信息访问是受权限保护的。除非你的应用程序在manifest文件中声明有适当的权限,否则将不会收到保护的信息更新。凡申请许可,都会有适当的LISTEN_标志。
3.7) ServiceState实现Parcelable接口,包含电话状态和服务相关的信息。下面的电话信息包含在返回ServiceState:
服务状态:IN_SERVICE,OUT_OF_SERVICE,EMERGENCY_ONLY,POWER_OFF
漫游指标
操作名称,短名称和数字编号
网络选择模式
3.8) SignalStrength实现Parcelable接口,包含手机信号强度的相关信息。
3.9) SmsManager管理短信操作,如发送数据,文本和PDU的短信。通过调用静态方法SmsManager.getDefault()这个对象。
3.10) SmsMessage一个短消息服务信息。
3.11) TelephonyManager用于访问有关设备上的电话服务的信息。应用程序可以使用这个类的方法来确定电话服务和状态,以及访问某些类型的用户信息。应用程序还可以注册一个监听者,接收的电话状态变化的通知。你不直接实例化这个类,而是你通过android.content.Context的getSystemService方法检索到一个实例。请注意,访问的一些电话信息受权限保护。除非你的应用程序在manifest文件中声明有适当的权限,否则将不会收到保护的信息更新。凡许可申请,他们会被记录在你访问受保护的信息的方法中。主要使用两个服务来访问telephony功能:
ITelephony提供与telephony进行操作、交互的接口,在packages/apps/Phone中由PhoneInterfaceManager.java实现。
ITelephonyRegistry提供登记telephony事件的接口。由frameworks/base/services/java/com/android/server/TelephonyRegistry.java实现。
4 frameworks/base/telephony/java/com/android/internal/telephony/cdma/
4.1) CdmaCall是Call的直接派生类。
4.2) CdmaConnection是Connection的直接派生类。
4.3) CDMAPhone是PhoneBase的直接派生类。
5 frameworks/base/telephony/java/com/android/internal/telephony/gsm/
5.1) GsmCall是Call的直接派生类,对通话过程中手机,连接的操作。
5.2) GsmConnection是Connection的直接派生类。
5.3) GSMPhone是PhoneBase的直接派生类。
6 frameworks/base/telephony/java/com/android/internal/telephony
6.1) AdnRecord实现Parcelable接口,用户加载和存储缩位拨号号码。
6.2) BaseCommands实现CommandsInterface接口,实现了电话事件的处理(发送message给对应的handler)。
6.3) Call得到第一次和最后一次呼叫,以及第一次呼叫的创建时间和连接时间。有两个派生类:CdmaCall和GsmCall。
public enum State {
IDLE, ACTIVE, HOLDING, DIALING, ALERTING, INCOMING, WAITING, DISCONNECTED, DISCONNECTING;
public boolean isAlive() {
return !(this == IDLE || this == DISCONNECTED || this == DISCONNECTING);
}
public boolean isRinging() {
return this == INCOMING || this == WAITING;
}
public boolean isDialing() {
return this == DIALING || this == ALERTING;
}
}
6.4) CallerInfo由电话号码来查看通话者的信息。
6.5) CallerInfoAsyncQuery异步查询。
6.6) CommandsInterface 描述了对电话的所有操作接口,如命令, 查询状态,以及电话事件监听等。由BaseCommands实现该接口。
6.7) Connection对连接过程一些数据的处理。有两个派生类:CdmaConnection和GsmConnection。
public enum DisconnectCause {
NOT_DISCONNECTED,/* has not yet disconnected */
INCOMING_MISSED,/* an incoming call that was missed and never answered */
NORMAL,/* normal; remote */
LOCAL,/* normal; local hangup */
BUSY,/* outgoing call to busy line */
CONGESTION,/* outgoing call to congested network */
MMI,/* not presently used; dial() returns null */
INVALID_NUMBER,/* invalid dial string */
LOST_SIGNAL,
LIMIT_EXCEEDED,/* eg GSM ACM limit exceeded */
INCOMING_REJECTED,/* an incoming call that was rejected */
POWER_OFF,/* radio is turned off explicitly */
OUT_OF_SERVICE,/* out of service */
ICC_ERROR,/* No ICC, ICC locked, or other ICC error */
CALL_BARRED,/* call was blocked by call barrring */
FDN_BLOCKED,/* call was blocked by fixed dial number */
CS_RESTRICTED,/* call was blocked by restricted all voice access */
CS_RESTRICTED_NORMAL,/* call was blocked by restricted normal voice access */
CS_RESTRICTED_EMERGENCY,/* call was blocked by restricted emergency voice access */
UNOBTAINABLE_NUMBER,/* Unassigned number (3GPP TS 24.008 table 10.5.123) */
IMSI_UNKNOWN_IN_VLR,/* IMSI is not known at the VLR */
IMEI_NOT_ACCEPTED,/* network does not accept emergency call establishment using an IMEI */
CDMA_LOCKED_UNTIL_POWER_CYCLE,/* MS is locked until next power cycle */
CDMA_DROP,
CDMA_INTERCEPT,/* INTERCEPT order received, MS state idle entered */
CDMA_REORDER,/* MS has been redirected, call is cancelled */
CDMA_SO_REJECT,/* service option rejection */
CDMA_RETRY_ORDER,/* requeseted service is rejected, retry delay is set */
CDMA_ACCESS_FAILURE,
CDMA_PREEMPTED,
CDMA_NOT_EMERGENCY,/* not an emergency call */
CDMA_ACCESS_BLOCKED,/* Access Blocked by CDMA network */
ERROR_UNSPECIFIED
}
6.8) DefaultPhoneNotifier实现PhoneNotifier接口。在其方法实现中,通过调用service ItelephonyRegistry来发布电话事件。
6.9) IccCard指SIM卡或UIM卡。
6.10) service ITelephonyRegistey由frameworks/base/services/java/com/android/server/TelephonyRegistry.java实现。这个类通过广播intent,从而触发对应的broadcast receiver。
6.11) Phone描述了对电话的所有操作接口;SDK的开发者不能获得此接口。通过PhoneBase和PhoneProxy来实现该接口。
enum State {
IDLE,/没有通话 no phone activity*/
RINGING, /*来电话(包括没有通话时来一路通话和正在通话时来新通话)a phone call is ringing or call waiting.In the latter case, another call is active as well*/
OFFHOOK;/*挂断通话The phone is off hook. At least one call exists that is dialing, active or holding and no calls are ringing or waiting.*/
};
enum DataState {
CONNECTED,/*有数据信号 IP traffic should be available*/
CONNECTING,/*正在进行数据连接 Currently setting up data connection*/
DISCONNECTED,/*无数据信号 IP not available*/
SUSPENDED;/*数据连接被创建了,但是有些连接不可用。例如语音通话使用在2G网络中。 connection is created but IP traffic is temperately not available. i.e. voice call is in place in 2G network*/
};
public enum DataActivityState {
NONE,/*没有数据流量No traffic*/
DATAIN,/*接收数据Receiving IP ppp traffic(公私合作关系<PPP,public-private partnership>是公共基础设施项目<如新的电信系统、机场和电厂>的一个资助模式。PPP具有处理错误检测、支持多个协议、允许在连接时刻协商IP地址、允许身份认证等功能。适合于调制解调器、HDLC位序列线路、SONET和其它的物理层上使用。它支持错误检测、选项协商、头部压缩以及使用HDLC类型帧格式<可选>的可靠传输。)*/
DATAOUT,/*发送数据 Sending IP ppp traffic*/
DATAINANDOUT,/*同时接收和发送数据 Both receiving and sending IP ppp traffic*/
DORMANT;/*数据连接可用,但是物理连接断开 The data connection is still active,but physical link is down*/};
enum SuppService {
UNKNOWN, SWITCH, SEPARATE, TRANSFER, CONFERENCE, REJECT, HANGUP;
};
APN的英文全称是Access Point Name,中文全称叫接入点,是您在通过手机上网时必须配置的一个参数,它决定了您的手机通过哪种接入方式来访问网络。
6.12) PhoneBase实现Phone接口,对Phone的基本实现。Phone.java预计从单一的应用程序线程实现,同一线程从PhoneFactory获取接口。有两个派生类:CDMAPhone和GSMPhone。
6.13) PhoneNotifier定义电话事件的通知方法。通过DefaultPhoneNotifier来实现该接口。
6.14) PhoneProxy实现Phone接口,实现了Phone所有函数。当不需要区分具体是CDMA Phone还是GSM Phone时,可使用PhoneProxy。
6.15) RIL继承BaseCommands类,实际实现CommandsInterface中的接口方法。
RILRequest代表一个电话服务命令请求,RILSender负责处理命令的发送,RILReceiver用户监听socket处理命令响应以及主动上报信息的接收。
RIL通过Socket和rild守护进程进行通讯。RIL将抽象的接口转化为封装电话服务命令的具体函数实现,如acceptCall或者dial,将它转换成对应的RIL_REQUEST_XXX发送给rild。
命令发送的标准流程:RILRequest.obtain(RIL_REQUEST_XXX,result)-->复制参数-->send发送EVENT_SEND-->RILSender处理EVENT_SEND-->将RIL_REQUEST_XXX写到out stream(socket)。RILReceiver在run()中建立socket。
响应和主动上报的标准流程:RILReceiver监听socket输入-->readRilMessage读取完整响应-->processResponse分别处理RESPONSE_UNSOLICITED(主动上报)与RESPONSE_SOLICITED(命令响应)。
send和processResponse是异步的,即电话服务命令的发送和响应是异步的。
上层通过GSMPhone对RIL进行了一层封装,通过Phone接口来提供RIL所实现的绝大部分功能。在Phone应用程序中,通过PhoneFactory.makeDefaultPhonesPhoneFactory.useNewRILPhoneFactory.registerPhone获取GSMPhone实例。