安卓开发课程设计报告

武汉理工大学华夏学院

课 程 报 告

课程名称:智能手机软件开发

题 目: 基于Android 的手机通讯录的设计与实现

专 业 信息工程系 班 级 学 号 姓 名 成 绩 指导教师

2015年3月23日至2015年6月12日

智能手机软件开发大作业

根据所学的Android 手机开发的知识,采用Eclipse 、JAVA 开发一个基于Android 平台的手机通讯录软件,具体要求如下:

1.要发该软件能够在Android4.0 以上的平台上运行。 2.要求软件界面美观,操作方便,符合日常使用规范。

3.能够通过该手机通讯录来添加新的联系人,用来存放联系人的姓名、单位、电话、QQ 、地址等信息。

4.能够通过该手机通讯录来编辑联系人信息,来修改联系人的个人信息。 5.能够通过该手机通讯录来调用系统的通信接口,直接给用户发短信,打电话。 6.在手机通讯录中,添加合适的菜单,来操作手机通讯录。 7. 将开发的过程写成报告,要求内容完整,格式规范,条理清晰。

1 设计目的

随着手机通讯录功能的不断加强与完善,手机通讯录对于人们的意义,

已不仅仅像记事簿一样显示通讯地址,而是向着个性化、人性化的方向发展移动终端的应用软件和需要的服务将会有很大的发展空间。根据这个特点,设计一个基于Android 平台的通讯录系统,能根据手机的特点,存储,管理,修改联系人信息,并且能够根据选定的联系人,对其拨打电话,发送短信等。

手机通讯录作为手机的基本功能之一,每天我们都在频繁地使用着。根据手机功能使用调查显示,通讯录从无到有,从英文到中文,经过了十几年的发展历程,今后的发展趋势就是从通讯录发展为名片夹,也就是在一个人名下,可以存储座机、手机、单位、地址、电子邮件等内容。所以手机通讯录功能越来越齐全,满足了人们的需求。

2 开发环境

由于该android 通讯录是一个基于Java 语言开发软件,所以选择了Eclipse3.4作为开发平台,作为插件,它能够安装Android SDK ,从而可以安装使用Android 虚拟机,使得程序得以开发,亦更为方便。

本通讯录系统就是在Eclipse3.4+Android平台环境下编写设计而成的。

3 需求分析

该系统针对的主要用户是Android 手机用户。Android 手机通信管理系统包括以下主要内容:

(1) 用户通过联系人功能可以保存联系人的详细信息,可以对联系人进行编辑、删除、拨打电话、发送短信可以根据索引条件搜索联系人。

(2) 用户通过短信记录功能可以发送短信,删除短信记录。 (3) 用户通过SD 卡所储存信息向通讯录批量导入联系人信息。

(4) 用户通过个人中心可以设置自己的详细信息,这样方便其他人了解自己,也可以将具有相同名字的联系人合并。

要设计一个良好的手机通讯录,就必须首先明确该应用环境对系统的要求。Android 手机通讯录应用背景:方便用户快捷通讯。

(1)类似于传统手机通讯录的联系人的添加、修改、查找、删除功能。 (2)指定联系人后,录音并发送给该联系人的留言功能。 (3)通过通讯录访问联系人的微博以实现与联系人互动的功能。 (4)接收短信、电话、语音留言和微博留言的信息并提醒用户。 (5)保存用户自身的个人信息以用于与他人联系时显示身份。

4 概要设计

下面数据流图是对于Android 手机通讯管理软件主要功能模块包括的简单结构图:联系人查看、联系人编辑、联系人添加、联系人删除、呼叫、发送短信、搜索,如图所示:

图4.1 Android手机通讯管理软件主要功能模块

联系人列表界面主菜单中包括添加联系人、搜索联系人、关于及查看系统版本号、退出菜单项。点击添加联系人,则进入联系人添加界面,添加成功后返回列表界面。点击搜索菜单,则进入联系人搜索界面,输入联系人的全名或一个字,即可查找相关联系人,点击联系人会进入联系人查看界面,可以对联系人进行编辑、删除、拨打电话、发送短信。如下图所示的Android 手机通讯管理软件业务流程图.

图4.2 Android手机通讯管理软件业务流程图

5 数据库设计

5.1 SQLite数据库简介

SQLite ,是一款轻型的数据库,是遵守ACID 的关联式数据库管理系统,它的设计目标是嵌入式的,而且目前已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需要几百K 的内存就够了。它能够支持Windows/Linux/Unix等等主流的操作系统,同时能够跟很多程序语言相结合,比如 Tcl 、C#、PHP 、Java 等,还有ODBC 接口,同样比起Mysql 、PostgreSQL 这两款开源世界著名的数据库管理系统来讲,它的处理速度比他们都快。SQLite 第一个Alpha 版本诞生于2000年5月. 至今已经有10个年头,SQLite 也迎来了一个版本 SQLite 3已经发布。

本系统采用的是Android 系统自带的SQLite 轻型数据库数据库。因此占用资源非常小。 5.2 数据库表结构

首先创建数据库,在数据库中创建表用来存储联系人数据,其中包括联系人姓名、手机号、QQ 、地址等联系方式。

6 详细设计与实现

6.1联系人浏览模块

6.1.1进入首界面,显示联系人列表。点击某个联系人会进入查看联系人界面,可以查看联系人的详细信息,对联系人进行编辑、删除、拨打电话发送短信等。截图所示:

图 6.1.1 通讯录联系人列表模块界面

6.1.2点击菜单按钮时,就会显示添加、查找、关于和退出功能。如果点击退出菜单,则会退出该软件。如图所示:

图6.1.2 通讯录主菜单项模块

6.1.3长按菜单显示Android 手机通讯截图如图所示:

图6.1.3 通讯录联系人界面菜单模块

6.2查看联系人模块

6.2.1在联系人界面点中击某个联系人,则会跳转到该界面。该软件实现了给联系人拨打电话和发送短信的功能。查看联系人界面截图如图所示:

图6.2 手机通讯查看联系人模块界面

6.3编辑联系人模块

6.3.1联系人编辑界面设置了返回列表菜单和删除联系人菜单。点击返回列表菜单,会返回到联系人浏览界面。编辑联系人界面如图所示:

图6.3 手机通讯录编辑联系人界面模块

6.4查找联系人模块

查找到所有包含该部分的联系人,并在ListView 中显示出来所有的联系人的姓名和手机号码,截图如图所示:

图6.4 通讯录查找联系人模块界面

7 总结

这学期的智能手机开发课程的学习,让我了解到手机开发端应用的广泛性,

以及对自己所学知识的总结,做手机通讯录,让我了解到手机已经成为日常生活中不可分割的一部分,所以手机上的功能满足人们的需求,才是手机通讯录开的重要性。

对于这次的课程设计,使我发现了自己所掌握的知识是真正如此的缺乏,自己综合应用所学的专业知识能力是如此的不足通过这次开发项目,我们学会了如何在一个项目中集成多种技术,如何合理的耦合各种小功能,如何解决各种开发中出现的问题。同时在这次开发中出现的问题也暴露出了我们对java 程序设计的一些问题,以及自己的动手能力还需要提高,而且做一个项目首先要明白这个项目的中心思想,这样才有目的去设计。

通过课程设计,使我深深体会到,干任何事都必须耐心,细致,课程设计过程中,许多迷惑有时不免令我感到有些心烦意乱,有几次因为不小心而出错,只能毫不情意地重来。但一想起老师对我们耐心的教导,认真对待的良好习惯. 这次课程设计使我在工作作风上得到了一次难得的磨练,一个人的性格很大程度上决定一件事情的进展以及对工作的态度和生活的态度,所以养成好的习惯能够帮助我克服各种苦难,能够帮助我在今后的学习中脚踏实地的工作。

通过这次手机开发通讯录课程设计,我能够更加深刻的了解到手机通讯录开发的前景以及所需的知识,总之在今后的学习中自己应该了解如今社会上开发手机通讯录所需的最新的技术,不能一成不变,只看书本上的知识,养成自我学习的良好习惯。

8 参考文献

[1] 罗伟. 基于 Android平台的即时通讯系统的研究与实现[D].湖南师范大学, 2009 . [2] 李刚,《疯狂Java 讲义》,电子工业出版社,2008 [3] 程峰,《JAVA 核心技术》,机械工业出版社,2007 [4] 王鹏,《JAVA 语言程序设计》,大连理工出版社,2005

9 附录源代码

public class DBHelper

{

/*

*操作数据库和各个表

*/

public static final String DATABASE_NAME="CONTACT_DB";

public static final String TABLE_CONTACTER="contact_person";

public static final String TABLE_MOBLIEPHONE="phone_number"; public static final String TABLE_GROUP="mygroup";

public static final String TABLE_EMAIL="email";

public static final String TABLE_QQ="qq";

public static final String TABLE_HOMEPHONE="home_phone_number"; public static final String TABLE_ADDRESS="address";

public static final String TABLE_FAX="fax";

//创建表的SQL 语句

public static String[] CreateTabelSQL;

private static SQLiteDatabase dbInstance;

public static final int VERSION = 4;

private MyDBHelper myDBHelper;

private Context context;

public DBHelper(Context context,String[] createtablesql)

{

this.context=context;

this.CreateTabelSQL=createtablesql;

}

public DBHelper(Context context)

{

this.context=context;

}

/**

* 打开数据库

*/

public void openDatabase()

{

if(dbInstance==null)

{

//创建数据库

myDBHelper= new MyDBHelper(context, DATABASE_NAME, VERSION); dbInstance=myDBHelper.getWritableDatabase();

}

/**

* 返回所有联系人

*/

public ArrayList> getAllContacter(String condition)

{

ArrayList> contaclist = new ArrayList();

Cursor cursor;

if(condition==null||condition.trim().equals(""))

cursor=dbInstance.query(TABLE_CONTACTER,

new String[]{"id","name","headImage"}, null, null, null, null, null);

else {

StringBuffer sqlBuffer=new StringBuffer();

sqlBuffer.append("select id,name,headImage from ")

.append(TABLE_CONTACTER)

.append(" where name like '%")

.append(condition)

.append("%'");

cursor=dbInstance.rawQuery(sqlBuffer.toString(), null);

}

cursor.moveToFirst();

while(!cursor.isAfterLast())

{

HashMap item=new HashMap();

item.put("contacter_id", cursor.getInt(cursor.getColumnIndex("id")));

item.put("name", cursor.getString(cursor.getColumnIndex("name")));

item.put("headimage", cursor.getString(cursor.getColumnIndex("headImage"))); //返回第一个手机电话号码

Cursor phoneCursor=dbInstance.query(TABLE_MOBLIEPHONE,

new String[]{"phone_number"}, "id=?", new

String[]{String.valueOf(cursor.getInt(cursor.getColumnIndex("id")))},

null, null, null);

phoneCursor.moveToFirst();

item.put("phonenumber",

phoneCursor.getString(phoneCursor.getColumnIndex("phone_number")));

contaclist.add(item);

cursor.moveToNext();

}

return contaclist;

}

/**

* 根据编号返回一个联系人

public Contacter getContacter(int id)

{

Contacter contacter = new Contacter();

Cursor contacterCursor =dbInstance.query(TABLE_CONTACTER,

new

String[]{"id","group_name","name","nick_name","birthday","workingunits","headImage"}, "id=?",

new String[]{String.valueOf(id)}, null, null, null);

contacter.id=id;

contacterCursor.moveToFirst();

contacter.name=contacterCursor.getString(contacterCursor.getColumnIndex("name"));

contacter.nickname=contacterCursor.getString(contacterCursor.getColumnIndex("nick_name"));

contacter.workingunits=contacterCursor.getString(contacterCursor.getColumnIndex("workingunits"));

if(contacterCursor.getString(contacterCursor.getColumnIndex("birthday")).trim()!=null

&&!contacterCursor.getString(contacterCursor.getColumnIndex("birthday")).trim().equals("")) {

String

string=contacterCursor.getString(contacterCursor.getColumnIndex("birthday")).trim();

contacter.birthday=Date.valueOf(contacterCursor.getString(contacterCursor.getColumnIndex("birthday")));

}

contacter.headimage=contacterCursor.getInt(contacterCursor.getColumnIndex("headImage")); //联系人的手机号码

Cursor phoneCursor =dbInstance.query(TABLE_MOBLIEPHONE,

new String[]{"phone_number"}, "id=?",

new String[]{String.valueOf(id)}, null, null, null);

phoneCursor.moveToFirst();

contacter.mobilephone=new String[phoneCursor.getCount()];

for(int i=0;i

{

contacter.mobilephone[i]=phoneCursor.getString(phoneCursor.getColumnIndex("phone_number"));

phoneCursor.moveToNext();

}

//联系人的座机号码

Cursor homephoneCursor=dbInstance.query(TABLE_HOMEPHONE,

new String[]{"home_number"}, "id=?",

new String[]{String.valueOf(id)}, null, null, null);

homephoneCursor.moveToFirst();

contacter.homephonenumber=new String[homephoneCursor.getCount()];

for(int i=0;i

{

contacter.homephonenumber[i]=homephoneCursor.getString(homephoneCursor.getColumnIndex("home_number"));

homephoneCursor.moveToNext();

}

//联系人的email

Cursor emailCursor=dbInstance.query(TABLE_EMAIL,

new String[]{"email"},

"id=?",

new String[]{String.valueOf(id)}, null, null,null);

emailCursor.moveToFirst();

contacter.email=new String[emailCursor.getCount()];

for(int i=0;i

{

contacter.email[i]=emailCursor.getString(emailCursor.getColumnIndex("email")); emailCursor.moveToNext();

}

//联系人的传真号码

Cursor faxCursor=dbInstance.query(TABLE_FAX,

new String[]{"fax_number"},

"id=?",

new String[]{String.valueOf(id)}, null, null,null);

contacter.faxnumber=new String[emailCursor.getCount()];

faxCursor.moveToFirst();

for(int i=0;i

{

contacter.faxnumber[i]=faxCursor.getString(faxCursor.getColumnIndex("fax_number")); faxCursor.moveToNext();

}

//联系人的地址

Cursor addressCursor=dbInstance.query(TABLE_ADDRESS,

new

String[]{"add_code","province","city","street","zip_code","country"},

"id=?",

new String[]{String.valueOf(id)}, null, null, null);

addressCursor.moveToFirst();

contacter.addresses=new address[addressCursor.getCount()];

for(int i=0;i

{

contacter.addresses[i]=new address();

contacter.addresses[i].add_code=addressCursor.getInt(addressCursor.getColumnIndex("add_code"));

contacter.addresses[i].province=addressCursor.getString(addressCursor.getColumnIndex("province"));

contacter.addresses[i].city=addressCursor.getString(addressCursor.getColumnIndex("city"));

contacter.addresses[i].street=addressCursor.getString(addressCursor.getColumnIndex("street"));

contacter.addresses[i].zip_code=addressCursor.getString(addressCursor.getColumnIndex("zip_code"));

contacter.addresses[i].coutry=addressCursor.getString(addressCursor.getColumnIndex("country"));

addressCursor.moveToNext();

}

return contacter;

}

/*

* 自动生成联系人编码

*/

public int generateContacterID()

{

Cursor cursor=dbInstance.query(TABLE_CONTACTER,

new String[]{"id"}, null, null, null, null, null); cursor.moveToFirst();

int i=0;

if(cursor.getCount()==0)

return 0;

while(!cursor.isAfterLast())

{

if(i!=cursor.getInt(cursor.getColumnIndex("id")))

return i;

i++;

cursor.moveToNext();

}

return i;

}

/**

* 插入新的联系人

*/

public boolean insertContacter(Contacter contacter)

{

boolean flag;

int id=generateContacterID();

//插入基本信息

flag=insertContactPerson(id,contacter.groupname,

contacter.name, contacter.nickname, contacter.birthday, contacter.workingunits, contacter.headimage); //插入email

if(contacter.email!=null&&contacter.email.length>0)

for(String email:contacter.email)

flag&=insertEmail(id, email);

//插入QQ

if(contacter.email!=null&&contacter.QQ.length>0)

for(long qq:contacter.QQ)

flag&=insertQQ(id, qq);

//插入传真

if(contacter.faxnumber!=null&&contacter.faxnumber.length>0)

for(String fax:contacter.faxnumber)

flag&=insertFax(id, fax);

//插入电话

if(contacter.mobilephone!=null&&contacter.mobilephone.length>0) for(String phone:contacter.mobilephone)

flag&=insertPhoneNumber(id, phone);

//插入座机号码

if(contacter.homephonenumber!=null&&contacter.homephonenumber.length>0) for(String homephone:contacter.homephonenumber)

flag&=insertHomePhone(id, homephone);

//插入地址

int i=0;

if(contacter.addresses!=null&&contacter.addresses.length>0)

for(address add:contacter.addresses)

{

flag&=insertAddress(id, i++,add.province,

add.city, add.street, add.zip_code, add.coutry); }

return flag;

}

/**

* 更新联系人

*/

public void updateContacter(Contacter contacter)

{

//先删除记录

removeContacter(String.valueOf(contacter.id));

//再重新插入

insertContacter(contacter);

}

/*

* 删除联系人

*/

public void removeContacter(String id)

{

dbInstance.delete(TABLE_EMAIL, "id=?", new String[]{id}); dbInstance.delete(TABLE_FAX, "id=?", new String[]{id});

dbInstance.delete(TABLE_HOMEPHONE, "id=?", new String[]{id}); dbInstance.delete(TABLE_MOBLIEPHONE, "id=?", new String[]{id}); dbInstance.delete(TABLE_QQ, "id=?", new String[]{id});

dbInstance.delete(TABLE_CONTACTER, "id=?", new String[]{id}); }

//数据库插入函数

public boolean insertValuesToTable(String tableName,ContentValues values) {

if( (long) dbInstance.insert(tableName, null, values)==-1)

return false;

else

{

return true;

}

}

/*

* 往表中插入数据

*/

//往group 插入数据

public boolean insertGroup(String groupname)

{

ContentValues values=new ContentValues();

values.put("group_name", groupname);

if (insertValuesToTable(TABLE_GROUP,values) ) return true;

else

return false;

}

//往ContactPerson 表插入数据

public boolean insertContactPerson(int id,

String groupname, String name, String nickname, Date birthday,

String workiingunits, int headImage )

{

ContentValues values=new ContentValues();

values.put("id", id);

values.put("group_name", groupname);

values.put("name", name);

values.put("nick_name", nickname);

values.put("birthday", birthday.toString());

values.put("workingunits", workiingunits);

values.put("headImage", headImage);

if (insertValuesToTable("contact_person",values) ) return true;

else

return false;

}

//往Email 表插入数据

public boolean insertEmail(int id,String email)

{

ContentValues values=new ContentValues();

values.put("id", id);

values.put("email", email);

if (insertValuesToTable("Email",values) )

return true;

else

return false;

}

//往address 表插入数据

public boolean insertAddress(int id,

int add_code,

String province, String city,

String street,

String zip_code, String country)

{

ContentValues values=new ContentValues();

values.put("id", id);

values.put("add_code", add_code);

values.put("province", province);

values.put("city", city);

values.put("street", street);

values.put("zip_code", zip_code);

values.put("country", country);

if (insertValuesToTable("address",values) )

return true;

else

return false;

}

//往QQ 表插入数据

public boolean insertQQ(int id,long QQ_number)

{

ContentValues values=new ContentValues();

values.put("id", id);

values.put("QQ_number", QQ_number);

if (insertValuesToTable("QQ",values) )

return true;

else

return false;

}

//往fax 表插入数据

public boolean insertFax(int id,String fax_number)

{

ContentValues values=new ContentValues();

values.put("id", id);

values.put("fax_number", fax_number);

if (insertValuesToTable("fax",values))

return true;

else

return false;

}

//往home_phone_number表插入数据

public boolean insertHomePhone(int id,String home_number) {

ContentValues values=new ContentValues();

values.put("id", id);

values.put("home_number", home_number);

if (insertValuesToTable("home_phone_number",values) ) return true;

else

return false;

}

//往phone_number表插入数据

public boolean insertPhoneNumber(int id,String phone_number) {

ContentValues values=new ContentValues();

values.put("id", id);

values.put("phone_number", phone_number);

if (insertValuesToTable("phone_number",values) ) return true;

else

return false;

}

/**

* 自建的SQLiteOpenHelper ,

*/

class MyDBHelper extends SQLiteOpenHelper

{

public MyDBHelper(Context context, String name,int version) {

super(context, name, null,version);

}

/**创建数据库

*

*/

@Override

public void onCreate(SQLiteDatabase db)

{

//创建表

for(String sql:CreateTabelSQL)

{

db.execSQL(sql);

}

}

/**更新数据库

*

*/

@Override

public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)

{

String sql = "drop table if exists " + TABLE_CONTACTER;

db.execSQL(sql);

onCreate(db);

}

}

}

指导老师评语

武汉理工大学华夏学院

课 程 报 告

课程名称:智能手机软件开发

题 目: 基于Android 的手机通讯录的设计与实现

专 业 信息工程系 班 级 学 号 姓 名 成 绩 指导教师

2015年3月23日至2015年6月12日

智能手机软件开发大作业

根据所学的Android 手机开发的知识,采用Eclipse 、JAVA 开发一个基于Android 平台的手机通讯录软件,具体要求如下:

1.要发该软件能够在Android4.0 以上的平台上运行。 2.要求软件界面美观,操作方便,符合日常使用规范。

3.能够通过该手机通讯录来添加新的联系人,用来存放联系人的姓名、单位、电话、QQ 、地址等信息。

4.能够通过该手机通讯录来编辑联系人信息,来修改联系人的个人信息。 5.能够通过该手机通讯录来调用系统的通信接口,直接给用户发短信,打电话。 6.在手机通讯录中,添加合适的菜单,来操作手机通讯录。 7. 将开发的过程写成报告,要求内容完整,格式规范,条理清晰。

1 设计目的

随着手机通讯录功能的不断加强与完善,手机通讯录对于人们的意义,

已不仅仅像记事簿一样显示通讯地址,而是向着个性化、人性化的方向发展移动终端的应用软件和需要的服务将会有很大的发展空间。根据这个特点,设计一个基于Android 平台的通讯录系统,能根据手机的特点,存储,管理,修改联系人信息,并且能够根据选定的联系人,对其拨打电话,发送短信等。

手机通讯录作为手机的基本功能之一,每天我们都在频繁地使用着。根据手机功能使用调查显示,通讯录从无到有,从英文到中文,经过了十几年的发展历程,今后的发展趋势就是从通讯录发展为名片夹,也就是在一个人名下,可以存储座机、手机、单位、地址、电子邮件等内容。所以手机通讯录功能越来越齐全,满足了人们的需求。

2 开发环境

由于该android 通讯录是一个基于Java 语言开发软件,所以选择了Eclipse3.4作为开发平台,作为插件,它能够安装Android SDK ,从而可以安装使用Android 虚拟机,使得程序得以开发,亦更为方便。

本通讯录系统就是在Eclipse3.4+Android平台环境下编写设计而成的。

3 需求分析

该系统针对的主要用户是Android 手机用户。Android 手机通信管理系统包括以下主要内容:

(1) 用户通过联系人功能可以保存联系人的详细信息,可以对联系人进行编辑、删除、拨打电话、发送短信可以根据索引条件搜索联系人。

(2) 用户通过短信记录功能可以发送短信,删除短信记录。 (3) 用户通过SD 卡所储存信息向通讯录批量导入联系人信息。

(4) 用户通过个人中心可以设置自己的详细信息,这样方便其他人了解自己,也可以将具有相同名字的联系人合并。

要设计一个良好的手机通讯录,就必须首先明确该应用环境对系统的要求。Android 手机通讯录应用背景:方便用户快捷通讯。

(1)类似于传统手机通讯录的联系人的添加、修改、查找、删除功能。 (2)指定联系人后,录音并发送给该联系人的留言功能。 (3)通过通讯录访问联系人的微博以实现与联系人互动的功能。 (4)接收短信、电话、语音留言和微博留言的信息并提醒用户。 (5)保存用户自身的个人信息以用于与他人联系时显示身份。

4 概要设计

下面数据流图是对于Android 手机通讯管理软件主要功能模块包括的简单结构图:联系人查看、联系人编辑、联系人添加、联系人删除、呼叫、发送短信、搜索,如图所示:

图4.1 Android手机通讯管理软件主要功能模块

联系人列表界面主菜单中包括添加联系人、搜索联系人、关于及查看系统版本号、退出菜单项。点击添加联系人,则进入联系人添加界面,添加成功后返回列表界面。点击搜索菜单,则进入联系人搜索界面,输入联系人的全名或一个字,即可查找相关联系人,点击联系人会进入联系人查看界面,可以对联系人进行编辑、删除、拨打电话、发送短信。如下图所示的Android 手机通讯管理软件业务流程图.

图4.2 Android手机通讯管理软件业务流程图

5 数据库设计

5.1 SQLite数据库简介

SQLite ,是一款轻型的数据库,是遵守ACID 的关联式数据库管理系统,它的设计目标是嵌入式的,而且目前已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需要几百K 的内存就够了。它能够支持Windows/Linux/Unix等等主流的操作系统,同时能够跟很多程序语言相结合,比如 Tcl 、C#、PHP 、Java 等,还有ODBC 接口,同样比起Mysql 、PostgreSQL 这两款开源世界著名的数据库管理系统来讲,它的处理速度比他们都快。SQLite 第一个Alpha 版本诞生于2000年5月. 至今已经有10个年头,SQLite 也迎来了一个版本 SQLite 3已经发布。

本系统采用的是Android 系统自带的SQLite 轻型数据库数据库。因此占用资源非常小。 5.2 数据库表结构

首先创建数据库,在数据库中创建表用来存储联系人数据,其中包括联系人姓名、手机号、QQ 、地址等联系方式。

6 详细设计与实现

6.1联系人浏览模块

6.1.1进入首界面,显示联系人列表。点击某个联系人会进入查看联系人界面,可以查看联系人的详细信息,对联系人进行编辑、删除、拨打电话发送短信等。截图所示:

图 6.1.1 通讯录联系人列表模块界面

6.1.2点击菜单按钮时,就会显示添加、查找、关于和退出功能。如果点击退出菜单,则会退出该软件。如图所示:

图6.1.2 通讯录主菜单项模块

6.1.3长按菜单显示Android 手机通讯截图如图所示:

图6.1.3 通讯录联系人界面菜单模块

6.2查看联系人模块

6.2.1在联系人界面点中击某个联系人,则会跳转到该界面。该软件实现了给联系人拨打电话和发送短信的功能。查看联系人界面截图如图所示:

图6.2 手机通讯查看联系人模块界面

6.3编辑联系人模块

6.3.1联系人编辑界面设置了返回列表菜单和删除联系人菜单。点击返回列表菜单,会返回到联系人浏览界面。编辑联系人界面如图所示:

图6.3 手机通讯录编辑联系人界面模块

6.4查找联系人模块

查找到所有包含该部分的联系人,并在ListView 中显示出来所有的联系人的姓名和手机号码,截图如图所示:

图6.4 通讯录查找联系人模块界面

7 总结

这学期的智能手机开发课程的学习,让我了解到手机开发端应用的广泛性,

以及对自己所学知识的总结,做手机通讯录,让我了解到手机已经成为日常生活中不可分割的一部分,所以手机上的功能满足人们的需求,才是手机通讯录开的重要性。

对于这次的课程设计,使我发现了自己所掌握的知识是真正如此的缺乏,自己综合应用所学的专业知识能力是如此的不足通过这次开发项目,我们学会了如何在一个项目中集成多种技术,如何合理的耦合各种小功能,如何解决各种开发中出现的问题。同时在这次开发中出现的问题也暴露出了我们对java 程序设计的一些问题,以及自己的动手能力还需要提高,而且做一个项目首先要明白这个项目的中心思想,这样才有目的去设计。

通过课程设计,使我深深体会到,干任何事都必须耐心,细致,课程设计过程中,许多迷惑有时不免令我感到有些心烦意乱,有几次因为不小心而出错,只能毫不情意地重来。但一想起老师对我们耐心的教导,认真对待的良好习惯. 这次课程设计使我在工作作风上得到了一次难得的磨练,一个人的性格很大程度上决定一件事情的进展以及对工作的态度和生活的态度,所以养成好的习惯能够帮助我克服各种苦难,能够帮助我在今后的学习中脚踏实地的工作。

通过这次手机开发通讯录课程设计,我能够更加深刻的了解到手机通讯录开发的前景以及所需的知识,总之在今后的学习中自己应该了解如今社会上开发手机通讯录所需的最新的技术,不能一成不变,只看书本上的知识,养成自我学习的良好习惯。

8 参考文献

[1] 罗伟. 基于 Android平台的即时通讯系统的研究与实现[D].湖南师范大学, 2009 . [2] 李刚,《疯狂Java 讲义》,电子工业出版社,2008 [3] 程峰,《JAVA 核心技术》,机械工业出版社,2007 [4] 王鹏,《JAVA 语言程序设计》,大连理工出版社,2005

9 附录源代码

public class DBHelper

{

/*

*操作数据库和各个表

*/

public static final String DATABASE_NAME="CONTACT_DB";

public static final String TABLE_CONTACTER="contact_person";

public static final String TABLE_MOBLIEPHONE="phone_number"; public static final String TABLE_GROUP="mygroup";

public static final String TABLE_EMAIL="email";

public static final String TABLE_QQ="qq";

public static final String TABLE_HOMEPHONE="home_phone_number"; public static final String TABLE_ADDRESS="address";

public static final String TABLE_FAX="fax";

//创建表的SQL 语句

public static String[] CreateTabelSQL;

private static SQLiteDatabase dbInstance;

public static final int VERSION = 4;

private MyDBHelper myDBHelper;

private Context context;

public DBHelper(Context context,String[] createtablesql)

{

this.context=context;

this.CreateTabelSQL=createtablesql;

}

public DBHelper(Context context)

{

this.context=context;

}

/**

* 打开数据库

*/

public void openDatabase()

{

if(dbInstance==null)

{

//创建数据库

myDBHelper= new MyDBHelper(context, DATABASE_NAME, VERSION); dbInstance=myDBHelper.getWritableDatabase();

}

/**

* 返回所有联系人

*/

public ArrayList> getAllContacter(String condition)

{

ArrayList> contaclist = new ArrayList();

Cursor cursor;

if(condition==null||condition.trim().equals(""))

cursor=dbInstance.query(TABLE_CONTACTER,

new String[]{"id","name","headImage"}, null, null, null, null, null);

else {

StringBuffer sqlBuffer=new StringBuffer();

sqlBuffer.append("select id,name,headImage from ")

.append(TABLE_CONTACTER)

.append(" where name like '%")

.append(condition)

.append("%'");

cursor=dbInstance.rawQuery(sqlBuffer.toString(), null);

}

cursor.moveToFirst();

while(!cursor.isAfterLast())

{

HashMap item=new HashMap();

item.put("contacter_id", cursor.getInt(cursor.getColumnIndex("id")));

item.put("name", cursor.getString(cursor.getColumnIndex("name")));

item.put("headimage", cursor.getString(cursor.getColumnIndex("headImage"))); //返回第一个手机电话号码

Cursor phoneCursor=dbInstance.query(TABLE_MOBLIEPHONE,

new String[]{"phone_number"}, "id=?", new

String[]{String.valueOf(cursor.getInt(cursor.getColumnIndex("id")))},

null, null, null);

phoneCursor.moveToFirst();

item.put("phonenumber",

phoneCursor.getString(phoneCursor.getColumnIndex("phone_number")));

contaclist.add(item);

cursor.moveToNext();

}

return contaclist;

}

/**

* 根据编号返回一个联系人

public Contacter getContacter(int id)

{

Contacter contacter = new Contacter();

Cursor contacterCursor =dbInstance.query(TABLE_CONTACTER,

new

String[]{"id","group_name","name","nick_name","birthday","workingunits","headImage"}, "id=?",

new String[]{String.valueOf(id)}, null, null, null);

contacter.id=id;

contacterCursor.moveToFirst();

contacter.name=contacterCursor.getString(contacterCursor.getColumnIndex("name"));

contacter.nickname=contacterCursor.getString(contacterCursor.getColumnIndex("nick_name"));

contacter.workingunits=contacterCursor.getString(contacterCursor.getColumnIndex("workingunits"));

if(contacterCursor.getString(contacterCursor.getColumnIndex("birthday")).trim()!=null

&&!contacterCursor.getString(contacterCursor.getColumnIndex("birthday")).trim().equals("")) {

String

string=contacterCursor.getString(contacterCursor.getColumnIndex("birthday")).trim();

contacter.birthday=Date.valueOf(contacterCursor.getString(contacterCursor.getColumnIndex("birthday")));

}

contacter.headimage=contacterCursor.getInt(contacterCursor.getColumnIndex("headImage")); //联系人的手机号码

Cursor phoneCursor =dbInstance.query(TABLE_MOBLIEPHONE,

new String[]{"phone_number"}, "id=?",

new String[]{String.valueOf(id)}, null, null, null);

phoneCursor.moveToFirst();

contacter.mobilephone=new String[phoneCursor.getCount()];

for(int i=0;i

{

contacter.mobilephone[i]=phoneCursor.getString(phoneCursor.getColumnIndex("phone_number"));

phoneCursor.moveToNext();

}

//联系人的座机号码

Cursor homephoneCursor=dbInstance.query(TABLE_HOMEPHONE,

new String[]{"home_number"}, "id=?",

new String[]{String.valueOf(id)}, null, null, null);

homephoneCursor.moveToFirst();

contacter.homephonenumber=new String[homephoneCursor.getCount()];

for(int i=0;i

{

contacter.homephonenumber[i]=homephoneCursor.getString(homephoneCursor.getColumnIndex("home_number"));

homephoneCursor.moveToNext();

}

//联系人的email

Cursor emailCursor=dbInstance.query(TABLE_EMAIL,

new String[]{"email"},

"id=?",

new String[]{String.valueOf(id)}, null, null,null);

emailCursor.moveToFirst();

contacter.email=new String[emailCursor.getCount()];

for(int i=0;i

{

contacter.email[i]=emailCursor.getString(emailCursor.getColumnIndex("email")); emailCursor.moveToNext();

}

//联系人的传真号码

Cursor faxCursor=dbInstance.query(TABLE_FAX,

new String[]{"fax_number"},

"id=?",

new String[]{String.valueOf(id)}, null, null,null);

contacter.faxnumber=new String[emailCursor.getCount()];

faxCursor.moveToFirst();

for(int i=0;i

{

contacter.faxnumber[i]=faxCursor.getString(faxCursor.getColumnIndex("fax_number")); faxCursor.moveToNext();

}

//联系人的地址

Cursor addressCursor=dbInstance.query(TABLE_ADDRESS,

new

String[]{"add_code","province","city","street","zip_code","country"},

"id=?",

new String[]{String.valueOf(id)}, null, null, null);

addressCursor.moveToFirst();

contacter.addresses=new address[addressCursor.getCount()];

for(int i=0;i

{

contacter.addresses[i]=new address();

contacter.addresses[i].add_code=addressCursor.getInt(addressCursor.getColumnIndex("add_code"));

contacter.addresses[i].province=addressCursor.getString(addressCursor.getColumnIndex("province"));

contacter.addresses[i].city=addressCursor.getString(addressCursor.getColumnIndex("city"));

contacter.addresses[i].street=addressCursor.getString(addressCursor.getColumnIndex("street"));

contacter.addresses[i].zip_code=addressCursor.getString(addressCursor.getColumnIndex("zip_code"));

contacter.addresses[i].coutry=addressCursor.getString(addressCursor.getColumnIndex("country"));

addressCursor.moveToNext();

}

return contacter;

}

/*

* 自动生成联系人编码

*/

public int generateContacterID()

{

Cursor cursor=dbInstance.query(TABLE_CONTACTER,

new String[]{"id"}, null, null, null, null, null); cursor.moveToFirst();

int i=0;

if(cursor.getCount()==0)

return 0;

while(!cursor.isAfterLast())

{

if(i!=cursor.getInt(cursor.getColumnIndex("id")))

return i;

i++;

cursor.moveToNext();

}

return i;

}

/**

* 插入新的联系人

*/

public boolean insertContacter(Contacter contacter)

{

boolean flag;

int id=generateContacterID();

//插入基本信息

flag=insertContactPerson(id,contacter.groupname,

contacter.name, contacter.nickname, contacter.birthday, contacter.workingunits, contacter.headimage); //插入email

if(contacter.email!=null&&contacter.email.length>0)

for(String email:contacter.email)

flag&=insertEmail(id, email);

//插入QQ

if(contacter.email!=null&&contacter.QQ.length>0)

for(long qq:contacter.QQ)

flag&=insertQQ(id, qq);

//插入传真

if(contacter.faxnumber!=null&&contacter.faxnumber.length>0)

for(String fax:contacter.faxnumber)

flag&=insertFax(id, fax);

//插入电话

if(contacter.mobilephone!=null&&contacter.mobilephone.length>0) for(String phone:contacter.mobilephone)

flag&=insertPhoneNumber(id, phone);

//插入座机号码

if(contacter.homephonenumber!=null&&contacter.homephonenumber.length>0) for(String homephone:contacter.homephonenumber)

flag&=insertHomePhone(id, homephone);

//插入地址

int i=0;

if(contacter.addresses!=null&&contacter.addresses.length>0)

for(address add:contacter.addresses)

{

flag&=insertAddress(id, i++,add.province,

add.city, add.street, add.zip_code, add.coutry); }

return flag;

}

/**

* 更新联系人

*/

public void updateContacter(Contacter contacter)

{

//先删除记录

removeContacter(String.valueOf(contacter.id));

//再重新插入

insertContacter(contacter);

}

/*

* 删除联系人

*/

public void removeContacter(String id)

{

dbInstance.delete(TABLE_EMAIL, "id=?", new String[]{id}); dbInstance.delete(TABLE_FAX, "id=?", new String[]{id});

dbInstance.delete(TABLE_HOMEPHONE, "id=?", new String[]{id}); dbInstance.delete(TABLE_MOBLIEPHONE, "id=?", new String[]{id}); dbInstance.delete(TABLE_QQ, "id=?", new String[]{id});

dbInstance.delete(TABLE_CONTACTER, "id=?", new String[]{id}); }

//数据库插入函数

public boolean insertValuesToTable(String tableName,ContentValues values) {

if( (long) dbInstance.insert(tableName, null, values)==-1)

return false;

else

{

return true;

}

}

/*

* 往表中插入数据

*/

//往group 插入数据

public boolean insertGroup(String groupname)

{

ContentValues values=new ContentValues();

values.put("group_name", groupname);

if (insertValuesToTable(TABLE_GROUP,values) ) return true;

else

return false;

}

//往ContactPerson 表插入数据

public boolean insertContactPerson(int id,

String groupname, String name, String nickname, Date birthday,

String workiingunits, int headImage )

{

ContentValues values=new ContentValues();

values.put("id", id);

values.put("group_name", groupname);

values.put("name", name);

values.put("nick_name", nickname);

values.put("birthday", birthday.toString());

values.put("workingunits", workiingunits);

values.put("headImage", headImage);

if (insertValuesToTable("contact_person",values) ) return true;

else

return false;

}

//往Email 表插入数据

public boolean insertEmail(int id,String email)

{

ContentValues values=new ContentValues();

values.put("id", id);

values.put("email", email);

if (insertValuesToTable("Email",values) )

return true;

else

return false;

}

//往address 表插入数据

public boolean insertAddress(int id,

int add_code,

String province, String city,

String street,

String zip_code, String country)

{

ContentValues values=new ContentValues();

values.put("id", id);

values.put("add_code", add_code);

values.put("province", province);

values.put("city", city);

values.put("street", street);

values.put("zip_code", zip_code);

values.put("country", country);

if (insertValuesToTable("address",values) )

return true;

else

return false;

}

//往QQ 表插入数据

public boolean insertQQ(int id,long QQ_number)

{

ContentValues values=new ContentValues();

values.put("id", id);

values.put("QQ_number", QQ_number);

if (insertValuesToTable("QQ",values) )

return true;

else

return false;

}

//往fax 表插入数据

public boolean insertFax(int id,String fax_number)

{

ContentValues values=new ContentValues();

values.put("id", id);

values.put("fax_number", fax_number);

if (insertValuesToTable("fax",values))

return true;

else

return false;

}

//往home_phone_number表插入数据

public boolean insertHomePhone(int id,String home_number) {

ContentValues values=new ContentValues();

values.put("id", id);

values.put("home_number", home_number);

if (insertValuesToTable("home_phone_number",values) ) return true;

else

return false;

}

//往phone_number表插入数据

public boolean insertPhoneNumber(int id,String phone_number) {

ContentValues values=new ContentValues();

values.put("id", id);

values.put("phone_number", phone_number);

if (insertValuesToTable("phone_number",values) ) return true;

else

return false;

}

/**

* 自建的SQLiteOpenHelper ,

*/

class MyDBHelper extends SQLiteOpenHelper

{

public MyDBHelper(Context context, String name,int version) {

super(context, name, null,version);

}

/**创建数据库

*

*/

@Override

public void onCreate(SQLiteDatabase db)

{

//创建表

for(String sql:CreateTabelSQL)

{

db.execSQL(sql);

}

}

/**更新数据库

*

*/

@Override

public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)

{

String sql = "drop table if exists " + TABLE_CONTACTER;

db.execSQL(sql);

onCreate(db);

}

}

}

指导老师评语


相关内容

  • 安卓贪吃蛇课程设计报告
  • 滨江学院 智能手机程序设计 题 目 安卓智能手机贪吃蛇游戏设计 院 系 专 业 信息工程 学生姓名 周盈伟 学 号 指导教师 高超 二0 一四 年 六 月 一日 目录 第一章 绪论............................................................ ...

  • 安卓实习报告
  • 太原科技大学 TAIYUANUniversityofScienceandTechnology 毕业实习报告 学生姓名:郭锦涛 学号:[1**********]6 指导教师:刘静 所属系部:计算机科学与技术 专业班级:计算机112001班 实习单位:西安软件服务外包学员 2014年9月19日 目录 一 ...

  • 北大青鸟有哪些专业
  • 北大青鸟有哪些专业课程 北大青鸟都有哪些专业课程?很多选择到北大青鸟学校学习IT 技术的同学很关心北大青鸟的专业情况.北大青鸟分校区很多,有很多校区都只有1个或者2个专业,作为北大青鸟体系的旗舰校区,北大青鸟旗舰总校所开设的专业就非常的全面,包含了网络营销.学士后java .软件开发专业.网络工程专 ...

  • 2012Q4百度移动应用统计报告
  • 导读 • App受众属性和兴趣属性发布,男性和高学历人群分布较多,最爱影视类 • 各类型应用人均启动和使用时长的行业均值发布,其中社交类启动次数最高 • 苹果新品表现大不相同,iPad 4和iPad mini表现抢眼,iPhone 5低于预期 • iOS用户进行系统升级意愿强烈,iOS 6.1 上线 ...

  • 以后学习产品设计就业前景的工资如何
  • 以后学习产品设计就业前景的工资如何 以后学习产品设计就业前景的工资如何?从相关数据了解到近年来全国人均薪水3900左右,看看我们自己是否达到标准,我们身边又有多少人拿着一两千的工资度日如年. 兰州北大青鸟,十余年专注计算机教育,是你可以仔细考虑的学校! Android 是主流智能手机的操作系统,Ja ...

  • 安卓软件开发前景如何?
  • 安卓软件开发前景如何? 国内外Android 市场正在如日中天的扩展,据市场调研机构NPDGroup 发布的一份报告称,去年第一季度基于Android 操作系统的智能手机在美国智能手机总销量中所占比例达到28%,首度超过苹果iphone ,苹果iphone 约为21%,相信在不久的将来会有更多的用户 ...

  • 国际市场营销课程论文
  • 国际市场营销课程论文 摘 要 一个公司的成功与否,很大程度上取决于其产品和市场策略的好坏.现代企业希望设计出能在目标市场成功实现其目标的市场营销组合,并将它付诸实施.这包括四种营销管理职能:分析.企划.实施及控制.企业通过SWOT分析即分析市场和市场营销环境,找到有吸引力的机会和避开环境中的威胁因素 ...

  • 企业管理系统
  • TERSUS 企业管理系统软件无代码自定制开发 主讲:陈严春(十万人以上规模制造企业部门管理系统开发及管理经验) 课程对象:加工制造生产性企业各部门各级管理人员.管理类工程师.IT 人员.主管.经理等.对无需编程能力开发管理软件管理系统有兴趣者. 授课方式:讲授互动.开发演练.小组研讨.案例分享.课 ...

  • 我国手机产业产业分析
  • 中国智能手机产业 分析报告 经济学13-3班 1306102076 田静雨 中国智能手机产业分析报告 随着全球经济的发展, 各国的通信产业都发展到了一个新高度, 尤其是手机行业由最初的单一化发展到今天的智能化.伴随着这一浪潮的蔓延, 分析我国智能手机产业发展的现状, 面临的问题以及机遇和挑战, 提出 ...