摘 要:Android原生系统自带的通讯录是一种极其简易的通讯工具,仅仅具备如下功能:增加/删除/修改联系人、发送短信、拨打电话的功能,不能满足用户一些个性化的需求。
本文通过研究Android系统打电话、发短信、发邮件的原理,实现了通过联系人来拨打电话、发送短信、发送邮件的功能,并对Android系统自带的通讯录进行了优化,增加了查询联系人、导入/导出联系人、设置通讯录全屏、增加组别来归类联系人等功能。
关键词:Android;通讯录;SQLite
1 引言
Android是一个以Linux为基础的开放源代码操作系统,主要用于移动设备,由Google成立的Open Handset Alliance(OHA,开放手持设备联盟)持续领导与开发中。安卓已发布的新版本为Android 4.4.2。Android系统初由安迪•鲁宾(Andy Rubin)开发制作,初开发这个系统的目的是利用其创建一个能够与PC上网的“智能手机”生态圈。但是随着智能手机市场快速成长,Android被改造为一款面向手机的操作系统[1]。
Android原生系统自带的通讯录功能简单,满足不了用户的个性化使用需求。各大软件公司纷纷推出了自己的通讯录软件来满足Android手机用户的需求。例如:腾讯旗下的“QQ通讯录”、奇虎360旗下的“360通讯录”、百度旗下的“百度通讯录”。
本文的目的是开发出一款能满足人们个性化需求且功能强大的通讯录,在原有通讯录的基础功能上增加了:查询联系人、增/删/改联系人、导入/导出联系人、发送联系人信息、设置通讯录全屏、增加组别来归类联系人等功能。它的提出弥补Android原生系统自带通讯录的不足之处,满足人们日益增长的功能需求。
2 需求分析
2.1 通讯录用例图设计
UML(统一建模语言,Unified Modeling Language)是一种定义良好、易于表达.功能强大且普遍适用的可视化建模语言。它融入了软件工程领域的新思想、新方法和新技术。它的作用域不限于支持面向对象的分析与设计,还支持从需求分析开始的软件开发的全过程。
在系统分析阶段,一般用UML来绘制用例图、状态图、类图、活动图、序列图、协作图、构建图、配置图等。UML的作用是从静态和动态方面来全面描述将要开发的系统[2]。
通讯录的用例图如图2-1所示。
图2-1 通讯录用例图
表2-1 UML用例详细格式描述
用例名称 通讯助手用例详细格式描述
用例标识号 1-1
参与者 张庚
简要说明 用户启动软件进入主界面,用户选择相应操作,软件做出相应响应
前置条件 用户启动软件,并在界面上触发相应事件
基本事件流 1. 用户启动软件,用例开始。
2. 用户点击添加联系人按钮,进入添加联系人界面。
3. 用户点击联系人搜索按钮,进入联系人搜索界面。
4. 用户长点击分组列表中的项,进入菜单选项。
(1)用户点击“添加分组”,进入添加分组界面;
(2)用户点击“重命名”,进入重命名界面;
(3)用户点击“添加联系人”,进入添加联系人界面;
(4)用户点击“全组成员移动...”,进入编辑状态;
(5)用户点击“取消”,取消对群组的编辑。
5. 用户长点击联系人的项,进入菜单选项。
(1)用户点击“进入标记状态”,进入联系人标记状态页面;
(2)用户点击“删除”,进入删除联系人状态;
(3)用户点击“编辑”,进入联系人编辑状态;
(4)用户点击“移动到..”,进入联系人移动界面;
(5)用户点击“取消”,取消对群组的编辑。
6. 用户点击联系人后的PopWindow图片,弹出对话框。
(1)用户点击“短信”按钮,进入短信编辑状态;
(2)用户点击“邮件”按钮,进入邮件发送状态;
(3)用户点击“电话”按钮,进入电话拨打界面。
7. 当软件在主界面上时,点击后退键,用例结束。
续表2-1 UML用例详细格式描述
其他事件流 1. 用户点击“全组成员移动...”时,弹出对话框,选择移动到哪个分组;
2. 用户点击“联系人编辑”时,当点击了“添加更多属性”后,会弹出对话框,让用户选择添加那些个属性;
3. 用户点击了“menu”键后,弹出菜单,包括“工具箱”、“标记”、“退出”按钮;
4. 用户点击了菜单键中的“工具箱”后,会弹出工具箱中的内容。
异常事件流 1. 在编辑联系人信息时,当没有输入联系人电话的时候,会弹出提示:联系人电话不能为空;
2. 在单击联系人后面的图片后,点击邮件按钮时,如果邮件为空时,会弹出提示:请输入合法的邮件。
后置条件 用户成功使用了通讯助手,并顺利完成相应操作。
注 释 无
2.2 软件功能需求
经过对UML用例图分析,软件的主要功能有:
(1) 通讯录的分组管理功能(如图2-2所示)。
1) 完成对联系人进行分组;
2) 完成对分组进行管理:新建、修改、删除分组;
3) 移动联系人到不同分组;
4) 从分组中删除联系人。
图2-2 通讯录分组功能图
(2) 实现对联系人的管理功能(如图2-3所示)。
1) 添加/修改/删除联系人;
2) 对联系人的分组管理:将联系人添加到某一新组;将联系人从某一组中移除;
将联系人从A组中移到B组;
3) 实现对联系人的批量管理。
(3) 实现联系人的附加功能(如图2-4所示)。
1) 打电话;
2) 发短信;
3) 发Email。
(4) 联系人信息的备份、还原。
(5) 动态搜索联系人信息。
(6) 实现软件的分享功能,可以将通讯录分享到各大主流社交平台。
图2-3 对单个联系人的管理
图2-4 联系人的附加功能
3 系统设计与实现
3.1 系统设计思想
经过需求分析阶段的工作,系统必须“做什么”已经清楚了,现在需要决定“怎么做”。总体设计的基本目的从全局的高度来分析通讯录要做什么以及通讯录怎样来实现。经过对各种设计模式的比较,决定采用MVC的设计模式。
MVC全名是Model View Controller,是模型-视图-控制器的缩写,是一种软件设计典范,其用业务逻辑和数据显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在界面和用户围绕数据的交互能被改进和个性化定制的同时,不需要重新编写业务逻辑。MVC被独特的发展起来用于映射传统的输入、处理和输出功能在一个逻辑的图形化用户界面的结构中[3]。
采用MVC的设计模式,决定了通讯录应该满足以下几个目标:
(1) 高内聚、低耦合:数据层和业务逻辑层分离,将数据层独立在了数据库中,即:项目框架中的com.zhanggeng.contact.db 和com.zhanggeng.contact.dbconstant ;业务逻辑层独立在了,项目框架中com.zhanggeng.contact.biz这样大限度了满足了软件设计中的低耦合;UI层即User Interface层,独立在了项目框架中的com.zhanggeng.-contact.ui中。这样进一步的实现了数据层和业务逻辑层的解耦。
(2) 可维护性:在后期需要对存放联系人信息的表进行修改时,不需要对整个程序进行修改,只需修改com.zhanggeng.contact.db包里的数据,其他的数据一律不需要改动,程序便可继续使用。
(3) 可扩展性:后期需要增加通讯录的功能时,只需要对工程里存放的接口层的包 即:com.zhanggeng.contact.dao中接口文件进行修改即可。
3.2 系统框架结构
系统采用MVC的设计模式,依据分层的思想来完成整个系统的设计。主要包括:软件框架搭建、数据库设计、业务逻辑层设计、UI层设计几部分,如图3-1所示。
下面对项目框架图作简要介绍:
(1) com.zhanggeng.contact.biz 软件的业务逻辑层:存放UI层和数据层进行交互的逻辑。包含文件:ContactManager.java 和 GroupManager.java。
图 3-1 项目框架图
(2) com.zhanggeng.contact.dao 存放相关实现接口,用来跟数据实体com.zhangg-eng.contact.model 进行关联。包含文件:IContact.java 和 IGroup.java。
(3) com.zhanggeng.contact.daompl 存放dao层的接口实现。包含文件:ContactService.java 和 GroupService.java。
(4) com.zhanggeng.contact.db 存放数据库的操作类,用来完成对数据库的各种操作。包含文件:DBHelper.java 和 SQLiteHelper.java。
(5) com.zhanggeng.contact.dbconstant 存放数据的操作常量,将数据库的所有语句进行了高度封装。包含文件:DB.java。
(6) com.zhanggeng.contact.model 存放数据实体,具体来说就是数据库中的表,联系人表和群组信息表,包含文件:Contact.java 和 Group.java。
(7) com.zhanggeng.contact.test 存放测试用例,来完成单元测试。包含文件:TestContactService.java 和 TestGroupService.java。
(8) com.zhanggeng.contact.tools 存放工具类,用来高效完成界面信息提示,图片加载。包含文件:ImageTools.java 和 Toasttool.java。
(9) com.zhanggeng.contact.ui 存放UI交互层,主要用来完成人机交互。包含文件太多,在此不一一列举。
(10) org.openintents.convertcsv.opencsv 存放对通讯录的导入导出操作代码。包含文件太多,在此不一一列举。
3.3 数据层的设计(Model)
(1) 在Android系统中实现数据存储主要有借助数据库SQLite3.0和借助数据临时存储类sharedpreference两种方式。
软件中的数据、联系人的信息、群组信息、均存放在数据库中,因此需要两张表:
1) 存放联系人信息的表:MyContact.db
建表语句:public static final String CREAT = " create table if not exists MyContact (
id integer PRIMARY KEY AUTOINCREMENT NOT NULL,image blob, name
varchar(20),"+ "groupId integer ,phone integer , homePhone integer ,otherPhone integer ,e_mail varchar(30),address varchar(200),birthday varchar(50),comment varchar(200),
isMark varchar(20) );";
2) 存放群组信息的表:MyGroup.db
建表语句:public static final String CREAT = "create table if not exists MyGroup (groupId integer PRIMARY KEY AUTOINCREMENT NOT NULL, groupName varchar(20));";
数据库的操作语句都封装在了DB.java文件中。采用接口隔离变化的原则,将数据库的操作进行了高度封装,如图3-2所示。
图3-2 数据库的操作语句
(2) 数据库操作类的使用
SQLiteOpenHelper是Android提供的一个管理数据库的工具类,可用于管理数据库的创建和版本更新。一般的用法是创建SQLiteHelper的子类,并扩展它的onCreate方法和onUpgrade方法[4] 。
为方便数据库的操作创建了DBHelper.java和 SQLiteHelper.java两个类,其作用分别介绍如下:
SQLiteHelper类继承了SQLiteOpenHelper用来完成软件中的数据库创建和更新操作,其数据处理方法有:
1) onCreate(SQLiteDatabase db):当软件次使用的时候生成数据表;
2) onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)当软件升级时更新数据表结构。
DBHelper类以SQLiteHelper为私有数据来完成对数据库的增/删/改/查操作。其数据处理方法有:
1) insert(String table, ContentValues values) 用于完成向数据库中添加数据;
2) executeSQL(String sql) 用于执行以insert,update,delete打头的sql语句;
3) update(String table, ContentValues values, String whereClause,String[] whereArgs) 用于根据条件来修改数据库中的记录信息;
4) select(String sql) 完成数据的查询操作。
3.4 业务逻辑层设计与实现(Controller)
业务逻辑层的存在主要是为了连接数据库和UI层,可以理解为数据传输的一个中介,包含ContactManager.java 和 GroupManager.java两个类。这两个类中包含了一系列的方法,接受从UI层传过来的数据、条件,并以这些传过来的数据、条件为参数对数据库进行操作。
下面将简要介绍这两个类中的一些数据处理方法。
(1) ContactManager类中的部分数据处理方法
changeGroupByCotact(int contactId, int toGroupId) 方法实现在UI界面上长点击群组后,弹出的Dialog上会出现“移动分组”这个功能。
changeGroupByGroup(int reGroupId, int toGroupId) 方法实现在UI界面上长点击群组后弹出的Dialog上会出现“全组成员移动到...”这个功能。
deleteById(int id)方法实现在UI界面上长点击联系人后弹出的Dialog上会出现“删除”这个功能。
(2) GroupManager类中的部分方法介绍
deleteGroupByID(int id) 方法实现在UI界面上长点击群组后会弹出来Dialog,完成上面的“删除”功能。
updateGroup(Group group)方法实现在UI界面上长点击群组后会弹出来Dialog,完成上面的“重命名”操作。
insertGroupByName(String groupName)方法实现在UI界面上长点击群组后会弹出来Dialog,完成上面的“添加分组”操作。
3.5 UI层设计与实现(View)
3.5.1 部分UI界面实现简介
手机通讯录界面设计,主要借助XML技术。
XML(eXtensible Markup Language)即可扩展标记语言,它与HTML一样,都是处于SGML,标准通用语言。Xml是Internet环境中跨平台的,依赖于内容的技术,是当前处理结构化文档信息的有力工具。扩展标记语言XML是一种简单的数据存储语言,使用一系列简单的标记描述数据,而这些标记可以用方便的方式建立,虽然XML占用的空间比二进制数据要占用更多的空间,但XML极其简单易于掌握和使用[5]。
Android推荐使用XML布局文件来控制视图,这样不仅简单、明了,而且可以将应用的视图控制逻辑从Java代码中分离出来,放入XML文件中控制,从而更好的体现MVC原则[4]。
(1) Android程序的主配置文件为AndroidManifest.xml文件,主要包括以下内容:
1) 程序的版本信息:android:versionCode="3"
android:versionName="1.2.3"
2) SDK版本信息:
其中minSdkVersion为本软件小支持的平台,targetSdkVersion包括这个软件的目标编译版本。
3) 信息,里面包括Android中各个页面的注册信息。
4)
其中包括:
的注册页面为程序的主启动页面。
(2) 用户界面设计
Android所有UI组件都是建立在View.ViewGroup基础之上的,Android采用了“组合器”设计模式来设计View和ViewGroup。对于一个Android应用的图形用户界面来说,ViewGroup作为容器来盛装其他组件,而ViewGroup里除了可以包含普通View的组件之外,还可以再次包含ViewGroup组件[4]。
下面介绍主要UI界面的实现,Android中的UI文件主要放在工程中的res/layout文件下。
(1) 联系人信息编辑页面:使用了复杂的页面布局,包括:线性布局 LinearLayout,相对布局RelativeLayout,以及 线性布局和布局相嵌套的布局技术。其中主要使用的控件有用来盛放在界面展示的图片;用来存放向主界面上显示的文字;可展开的列表组件用来展示群组信息.联系人列表信息,效果如图3-3所示。
图3-3 应用主界面
(2) 联系人编辑界面:同样的使用了复杂的布局,包络:线性布局LinearLayout,相对布局RelativeLayout,以及线性布局和布局相嵌套的布局技术。除了使用之外,还使用了来完成滚动操作。效果如下图3-4所示。
图3-4联系人编辑页面
(3) 通话界面:主要使用了控件,用来向页面展示,一个图片按钮。效果如图3-5所示。
图 3-5 弹出的通信界面
3.5.2 Android系统发短信、打电话、发Email原理探究
Android系统内置了短信,电话,Email这些服务,仅仅需要调用这些服务即可,这Android中调用系统服务需要通过Intent来执行。
Intent封装了Android应用程序需要启动某个组件的“意图”。不仅如此,Intent还是应用程序组件之间通信的重要媒介[4]。 因此,可以通过Intent来调用这些系统内置的服务来完成的功能。
(1) 发送短信
Uri uri = Uri.parse("smsto:" + phone);
Intent itent = new Intent(Intent.ACTION_SENDTO, uri);
itent.putExtra("sms_body", "");
startActivity(itent);
(2) 拨打电话
Intent intent = new Intent(Intent.ACTION_CALL);
intent.setData(Uri.parse("tel:" + phone));
startActivity(intent);
(3) 发Email
Intent i = new Intent(Intent.ACTION_SEND);
i.setType("message/rfc822") ;
i.putExtra(Intent.EXTRA_EMAIL,Email);
i.putExtra(Intent.EXTRA_SUBJECT,"在这儿填写邮件主题");
i.putExtra(Intent.EXTRA_TEXT,"在这儿填写邮件内容");
startActivity(Intent.createChooser(i, "请选择邮件发送程序:"));
4系统测试
Android程序必须在Android手机上运行,因此Android开发时必须准备相关运行.调试环境。Android应用的运行、调试有两种方式:
种:Android真机,调试速度更快,效果更好;
第二种:在PC上创建Android虚拟设备(即AVD)。
4.1 测试工具
出于时间、性能方面的考虑,选择的测试工具是Android真机Coolpad7269,该手机搭载了现阶段应用广泛的Android 4.2.1系统,满足了运行、调试程序的需求。
在进行测试之前,需要打开手机的调试模式“设置——>开发者选项”,选中USB调试即可,如图4-1所示。
图4-1 开启调试模式
4.2 测试用例及测试结果
单元测试集中检验软件设计的小单元——模块。正式测试之前必须先通过编译程序检查并且改正所有语法错误,然后用详细设计描述作指南,对重要的执行通路进行测试,以便发现模块内部的错误[6]。
单元测试时使用的工具如下:
(1) Android SDK的util包中的专门用于进行测试的类Log.class。可以通过给程序加入Log来查看程序的运行状况。
(2) Android SDK中的widget包中的Toast,Toast是一个简单消息提醒框,进行相应操作后,就会弹出对应的操作,来完成测试工作。
(3) Android SDK本身提供了单元测试框架Junit ,通过继承Android单元测试框架类AndroidTestCase.class 来完成测试,文件存放位于:android.test.AndroidTestCase包中。
TestGroupService对群组信息进行测试,测试方案为:通过单元测试框架Junit添加测试,并打通过打Log,将测试信息输出在控制台上,来查看测试结果。将程以Run as :Android Junit Test的形式运行,如果成功运行,则测试通过。否则修改Bug。
(1) 测试是否测试成功添加群组信息。运行程序后,测试结果为成功,如图4-2所示。
图4-2 成功添加群组信息
(2) 测试一共有几组联系人信息。运行程序并在软件中添加3组信息,预期结果LogCat中会打印出3。运行程序后,测试结果为成功,如图4-3所示。
(3) 测试是否可以成功命名群组。运行程序,预期结果,群组会被重命名。运行程序后,测试结果为成功。
图4-3 测试一共有几组信息
图4-4 测试是否成功命名群组
4.3 测试结果
在安智软件市场上线进行公测并收集公测结果。
公测中收集到的软件Bug:
(1) 在联系人后面的图片按钮上点击后,弹出来的PopupWindow中点击发送Email按钮后,软件会异常终止;
(2) 在联系人后面的图片按钮上点击后,弹出来的PopupWindow太小以利于操作;
(3) 在给联系人添加头像时,调用系统摄像机进行拍照,拍完之后,照片不能显示为联系人的头像;
(4) 在给联系人添加头像时,弹出来的PopupWindow应该再大点。
(5) 应该添加快速拨号功能,将更方便于操作;
(6) 在新建联系人信息时,信息填写格式,应改加上限制:
1) 联系人的电话不能是“1213456”、“544542”之类的字符串;
2) 联系人的邮件格式应该是“xxxxxxxsx@assx.xxx”,不应该是“555dfa”之类的字符串。
针对收集到的上述问题,采取相应的优化对策。
5 结束语
三个月的努力,基于Android平台的通讯助手终于完成。在整个过程中,碰到了各种困难,在老师的帮助下,顺利克服了一个个困难。在进行毕业设计的过程中,不仅巩固了之前所学知识,同时学到了许多新的东西。从有了思路,再到设计,再到实现一个个功能,再到不断的优化解决Bug,整个过程都是一个充满挑战而又充实的过程。
本文主要针对Android系统中的通讯录进行了进一步优化,主要贡献如下:
(1) 探究了Android系统中打电话,发短信,发Email的实现原理;
(2) 理论结合实践,将大学里的软件工程理论知识通具体开发相结合实现了一个软件的开发;
(3) 对Android原生系统自带的通讯录进行了优化,增加了添加分组,进行群组管理的功能;
(4) 对Android原生系统自带的通讯录进行了优化,增加了联系人搜索功能;
(5) 对Android原生系统自带的通讯录进行了优化,增加了联系人备份,导入功能;
(6) 对Android原生系统自带的通讯录进行了优化,增加了通讯录全屏的功能;
(7) 对Android原生系统自带的通讯录进行了优化,增加了主流的社交软件的分享功能,如:分享到新浪、分享到QQ空间、分享到腾讯微博。
致谢
驰隙流年,恍若一瞬星霜换。大学四年,一晃而过。四年里成长了很多。
首先,感谢赐我生命并养育我的父母,在23年里,对我持续不断的支持与鼓励,在我病痛时给予无微不至的关怀;在我失败时,竭尽所能给予鼓励;他们为我义无反顾的付出,却未曾给予回报,只能加倍努力,加倍学习,加倍工作。
其次,非常感谢大学里的传道授业恩师,他们给予我知识,技术上的帮助、支持:课堂上,风趣幽默的讲解;课堂下,对于碰到的疑难问题耐心的讲解;生活上,无微不至的照顾;非常感谢我的指导老师:芦彩林,他在整个过程中,不断给予各种帮助,提出各种建议,帮我顺利解决毕设过程中遇到的各种困难。
其次,感谢在大学里陪伴度过四年的同学,他们给予生活上无私的帮助,伴我顺利度过大学四年。
后,衷心的感谢各位审阅论文和参加答辩的专家,教授。
参考文献
[1] 郑汉杰. 智能手机操作系统与 Android 简介[M]. 金山, 2012 (5).
[2] Larman C,Applying U M L. Patterns: An Introduction to Object-Oriented Analysis and Design and the Unified Process[M]. Pearson Education,2001.
[3] 黎永良,崔杜武.MVC 设计模式的改进与应用[J].计算机工程,2005,31(9):96-97.
[4] 李刚.疯狂Android 讲义(第2版)[M]. 北京:电子工业出版社,2013.
[5] HM Deitel,PJ Deitel,康博. XML 编程技术大全[M].清华大学出版社,2002.
[6] 张海藩.软件工程导论[M]. 北京:清华大学出版社,1998.
[7] 张平,马骁.共享智慧:开源软件知识产权问题解析[M].北京:北京大学出版社, 2005.
[8] Jensen M C. Eclipse of the public corporation[J]. Harvard Business Review,1989,67(5):61-74.
[9] Horstmann Gay S.JAVA核心技术卷1 [M].北京:北京大学出版社,2013.
[10] 程春蕊,刘万军.高内聚低耦合软件架构的构建[J].计算机系统应用,2009,(7):19-22.、
paperisok论文查重网温馨提示:论文写作中可以借助论文抄袭检测系统帮助你修改论文,特别是降低重复率这块非常有效果!
.—— END ——.