技术开发 频道

Ophone语音业务设计模式与功能实现

  【IT168技术】语音业务是手机应用最为广泛的业务。在更早的传统的非智能手机中,手机只能完成最基本的拨号和通话功能。对于移动网络来说,终端提供主叫和被叫信息,网络完成接续动作,从而实现主被叫的通话。

  本例通过便捷呼叫、来电判断运营商、自动保存呼叫记录3个功能来介绍通话应用相关的开发。在实现例子的过程中,穿插讲解Broadcast Receiver、文件操作、电话状态管理等知识。旨在使读者在完成本章节的学习之后,熟悉OPhone所提供的通话管理功能,并掌握该功能常用的开发方法。

  本例需要实现以下功能:

  1、使用若干按钮实现联系人一键拨号。

  2、根据呼入电话自动判断该电话来自于哪个运营商。

  3、程序在后台运行时,可自动记录来电号码,并存储至文件系统。

  有兴趣的读者可以根据上述功能,实现事件触发呼叫、来电归属地自动查询等更为强大的功能。

  针对上述功能,具体要求明确如下:

  1、程序主界面上有若干按钮,每个按钮的名称和代表号码可由用户自行编辑。

  2、电话呼入时手机界面会发生切换,判断所属运营商的结果会用提示给出。

  3、为保证程序的隐蔽,程序可以在后台运行时就可以记下呼叫记录。当程序运行在前台时,可以读出记录并显示。

  设计模式与功能实现

  做了需求分析之后,本来可以直接进入代码编写阶段,但是在需求和代码之间,还需要进行代码设计,代码设计过程中需要应用一些设计模式的技巧。本书对各种模式的知识仅作简单介绍,有兴趣的读者可以阅读例如高焕堂编写的《应用框架原理与程式设计36技》等书籍。

  本节针对需求分析中的3个功能来梳理设计的流程,并明确在每个功能中需要关注的技术细节。

  一、从按钮响应到MVC模式

  根据需求分析,第二个和第三个功能不需要实际的程序界面,所以第一个功能主导程序界面设计。为简便起见,我们在程序界面上依次放置Button01~Button03共3个按钮,每个按钮实现一个常用联系人的呼叫,如图4-1所示。按钮标题即为联系人名称,单击按钮之后发起呼叫。如果仅仅为了实现一键拨号的功能,可以把标题以及呼叫的号码写在代码中:

  Button button.setText("联系人名称");

  button.setOnClickListener(new View.OnClickListener(){

  public void onClick(View v) {

  //呼叫联系人号码

  }

  }

Ophone语音业务设计模式与功能实现
▲程序界面初步设计

  但是这么做会失去很多灵活性,用户不能根据自己的需要更改一键呼叫的联系人名称和号码,而是需要开发者修改代码后重新编译。所以,每个按钮所对应的联系人名称和号码需要储存起来,并且可以通过某种途径来编辑。在按钮界面呈现时,程序从中取出联系人名称作为按钮标题;在按钮单击响应时,取出号码进行呼叫。在这里,我们选择使用菜单对联系人名称和号码进行修改。

  从上面分析得知,按钮界面呈现和按钮响应是两个独立的过程,所以我们将事件响应、呈现、数据3个部分独立出来,分别进行设计和代码编写,如图4-2所示。

  这就是著名的MVC设计模式(模型Model-视图View-控制器Control)。MVC模式是Xerox PARC在20世纪80年代为编程语言Smalltalk-80发明的一种软件设计模式,至今已被广泛使用。

Ophone语音业务设计模式与功能实现
▲事件响应、呈现和数据的关系

  由于运用MVC的应用程序的3个部件是相互独立的,所以改变其中一个不会影响其他两个。比如将按钮响应的代码从拨打电话改成向该号码发送短信并不会影响软件界面,将联系人的资料扩充一个Email地址也不会造成按钮响应错误。如果这个应用程序是由多个人开发的,在确定好各个部分的接口之后,每个人只需关注自己所负责的部分就行了。所以依据这种设计思想,你能构造良好的“松耦合”的构件。

  OPhone建议使用MVC开发模式,其资源数据文件R.java、Strings.xml等相当于Model,界面文件main.xml相当于View,而作为主要控制功能的java源代码相当于Control,如图4-3所示。

Ophone语音业务设计模式与功能实现
▲工程结构的MVC解读

${PageNumber}

  二、手机状态与包

  为了实现呼入电话的判断,系统需要在呼入电话时执行号码分析的方法,所以在软件中我们需要设置一个事件的触发来调用该方法。在正有电话呼入时,手机处于通话的界面,所以就算在程序的主界面上显示了判断结果,用户也看不到,所以我们采用提示消息(Toast)功能来显示判断结果。简便起见,在本例中我们假设中国移动的号段为:134~139、中国联通号段为130~131,中国电信号段为133,其他诸如15x和18x号段暂不进行分析。

  上面这段话分析了功能2的实现流程,我们可以从中看到MVC设计模式的影子:设置触发是Control,提示消息是View,号段说明是Model。

  具备移动通信基础知识的读者们都知道,只要手机处于开机的状态,无论是否处于通话状态,手机和移动网络会进行很多信息交互。在非通话状态时,手机通常会有如下动作:网络寻找和选择、用户注册、信号检测等;在通话或者数据传输时,手机和移动网络除了基本的语音数据传输之外,还要进行如信号强度监听、数据传输方向指示、小区切换、短信发送报告等操作。

  当前,大多数手机平台并未开放上述底层网络的接口给开发者,例如Windows Mobile 只是规定了RIL(Radio Layer Interface)的一个标准,很多厂商没有实现该接口。OPhone手机平台提供了android.telephony和android.telephony.gsm两个package给开发者使用。这两个package提供了手机基本信息检测的API,例如网络类型、链接状态以及手机号码字符操作工具。在android.telephony.gsm中,有一些GSM网络特有的功能,如短信的PDU功能(CDMA收发短信不是用PDU的)。网络接口结构如图4-4所示,具体实现可以查看源代码的hardware/ril/ 部分。

Ophone语音业务设计模式与功能实现
▲通信网络接口结构示意图

  在eclipse的package explorer(如图4-5所示)中我们可以看到android.telephony的包(package)结构。它的主要构成有:小区位置、邻居小区信息、手机号码格式监视、手机号码字符工具、电话状态监听、服务状态监听、手机信息管理、短信管理等。其中电话状态监听就是我们所需要的触发事件。

Ophone语音业务设计模式与功能实现
▲android.telephony包结构

  三、后台运行与文件读写

  第三个功能和第二个功能有点类似,都是在接到呼入电话时进行某项操作,并且该操作是无界面的。在第二个功能的基础上,系统将通话时间和来电号码进行记录。从用户的使用体验角度去考虑,该软件需要在手机开机时自动启动,这样才能记录下所有的通话记录。

0
相关文章