首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

基于Android平台的双网双待的设计方法 03

基于Android平台的双网双待的设计方法 03

3. 3 Android 双网双待通话机制的实现
   
    Android 系统电话服务的实现基础是RIL.在Android 单模状态下的RIL 同TI 等平台类似,均使用了Google 默认的参考接口,也就是通过打开modem 侧提供的串口或者USB 虚拟串口向modem 侧发送AT 指令的方式,进行实际的无线通信。比如,UI上层向RIL 层发送RIL_REQUEST_DIAL 请求,RIL 层在接收到该请求的时候,通过串口向modem 发送“AT***”命令,发起呼叫,当然,最终真正实现通话的是modem 侧的功能,此时,与Android 就无关了。Android 平台RIL 与modem 的工作原理如图4 所示。

图4 RIL 与modem 的工作原理

    呼叫(call)构建于电话服务的基本架构之上。
   
    与呼叫相关的主要用户接口,其实就是基于ITelephony 接口实现Phone 应用中的“Phone”服务,通过TelephonyManager 提供访问接口。此服务内部通过PhonyFactory 获取的GSMPhone /CDMAPhone 来访问RIL,提供诸如拨号、接通、挂断、保持通话等服务功能。Android 双网双待呼叫部分的结构如图5 所示。

图5 android 双网双待呼叫部分结构

    Android 系统双网双待呼叫部分的实现,从GSMPhone /CDMAPhone到对应RIL 的路径中间主要涉及几个关键数据结构,即GSMCall /CDMACall、CallNotifiter、GSMConnection /CDMAConnection、CallTracker 等类。
   
    其中GSMCall 和CDMAPhone 都继承Call 基类,提供基本的呼叫控制结构以及呼叫状态,如Hold、Active 等信息,每个接通的GSMCall / CDMACall 都拥有一个或多个(conference call)GSMConnection /CDMAConnection 结构,用于维护呼叫时长等相关信息。CallTracker 是呼叫模块的核心,它提供与呼叫相关的接口,如通话、挂断等。GSMPhone /CDMAPhone 拥有CallTracker的实例,并封装相应的接口,这个接口通过调用GSMPhone /CDMAPhone中的CommandsInterface 实现,即提交的RIL 封装。
   
    除此之外,CallTracker 还维护当前的GSMCall 和CDMACall列表,保持对所有呼叫状态的追踪,提供对来去电等呼叫状态的管理。实现追踪的方法为pollCallsWhenSafe,通过CommandsInterface的getCurrentCalls 接口获取当前活动的呼叫列表。这一操作的底层实现为AT + CLCC(不同的Modem 实现可能不同),这是从Modem 获取呼叫状态列表的主要接口。回调通过ENENT_ POLL _ CALLS-RESULT 完成,回调函数为handlePollCalls,这是获取Modem 中实际呼叫信息的核心方法,也是Tracker的含义所在。handlePollCalls 完成实际的追踪功能,根据底层上报的Outgoing、Incomming 以及Active、Hold 等状态更新Call列表的信息,每个呼叫在其生命周期内的状态转换,在Call-Tracker 中都可得到体现,并将这些变化信息及时通知其关注者,也就是实现Phone 的应用。
返回列表