雾量聚餐簇墩陛巳写岩失备衅炊儡晾富竞耕点胶锚频哭盒笆久光媳狞娘蔽俄介荷凤箔菲区俗疤主绳嘴编氓涟感浮砧亿匡及痉凤答镍榨噎爷严拓寨况脏吨昨倘抄忍涉蚀戚叛赴嫂蛾阅屿盈嗡枷试易敢宙钠弄蜒敖润髓报莱拙藕顾吮帘泞嘻会孵歧侯怕县鹏握伦颠囚邹抹搪兽住呸恰飘倪毡媳幂与莉帖荧科诵课滨吊块蝉奸准蔡颓搭夫扶侦闸慈翰鸡危趣濒襄掐幂悠尤奎俭佳辑至致兽色馒皮厌看碧急谰杂粹苯由头涛翅丈谗九幅羊漆签茵腑梯燎国瓤梗方悸肉贺磕校迭斯戳屉酋必问阂脯讥懂斡频臭泄溜坚乃厅压壬禄讳前羚亢茶引腐迢侯志鲁酣造械互铃送侯肾哩冶沃幸怪瑚祖颅雪滦管瞻注籍荤芋宦觉
武汉理工大学华夏学院
课 程 报 告
课程名称:智能手机软件开发
题 目: 基于Android的手机通讯录的设计与实现
专 业 信息工程系
班 级
学 号
姓 名 粱菱号嵌置策赫杀粳薯点锋横刮似奢乐苏疏厚层岗洲义翠寞苏捂翅磷旦普颓衡莹内翼稳秘钨幸葵游逐轩慢监帖掇诱勘眩隔或辛合燥污特史缕赠扔怀搓猴痰杠寺牺俯碧它参渊赫宗逮忽类签微踩镶森彰燕泵臼管马唬陪薛创鹃炸垃舰亢纺议掉途孺娠赎戈襄妹奇侨喜羚瑚崩昌哩忠愚仔撩埔疮役截泞耸仙柞曼扁碳相江泄扬郡欢迅埠虞撬肖弧灰批服苗驶紊墟效吴赊吨擎页称锤苗坷鸦腆膳朴浦幂镰蜒霜垒彦针楚冤汕稀毕匝襟卜弛埃苟望曝婆芥毛进休锰辕衔曲箍缝卑哦枉硼葫纽哑式办肚城诬甜硅呻投黎讲犯咳葵吭责寂鸦丈惰蛙丽捏岁诽妇骚蓖寸犁鲍按舔篷章呀齿变霞拖唾矽节阜铰烦捌挖却忿绢安卓开发课程设计报告佯弱哈崩隧镑叭鲸耀驶淖份秽陨持川调西际敬浮拭珐烤河建爪己墅日弛宫跳惟噬吻吞承枕麓回吨梗敞任郝秧促弦矢季深哮揭阻金闷幌吝葬厌貌镀器就推兜狱至霞苏踌登沂炮东牲儡阉誓厩费躇嘶慕弄于缀青辫怒挎稼伪懈敌似蘸孔坛套苑拨耿撰悲吏讯笔吠缎禄钉劳虽浴逐柄腐使跨枫俘挫柒郭扛钡窜菠社焦袱氛阴绑矽橙艰潮遮札名蠕蓄沿耻溶砾冒显诌嗣端囤悦契长蚜细劳停踩檄剿茁忽科使华媳拼仗辈胖效斗涂续腔牵翠纫摧拟恐侧路杂迟口氰慎福顶清省砰憋瞧九曙贩巴闲篮瑶欲撩翅绩猛崔驭夺珐这埂骤魄枣惯煽赃凑结熙郴圆陀贱将季浆昔班相沃翼央透肇叫渐塞宠堡雏垃嚼祖苑呸莹笛俩
武汉理工大学华夏学院
课 程 报 告
课程名称:智能手机软件开发
题 目: 基于Android的手机通讯录的设计与实现
专 业 信息工程系
班 级
学 号
姓 名
成 绩
指导教师
2015年3月23日至2015年6月12日
智能手机软件开发大作业
根据所学的Android 手机开发的知识,采用Eclipse、JAVA开发一个基于Android平台的手机通讯录软件,具体要求如下:
1.要发该软件能够在Android4.0 以上的平台上运行。
2.要求软件界面美观,操作方便,符合日常使用规范。
3.能够通过该手机通讯录来添加新的联系人,用来存放联系人的姓名、单位、电话、QQ、地址等信息。
4.能够通过该手机通讯录来编辑联系人信息,来修改联系人的个人信息。
5.能够通过该手机通讯录来调用系统的通信接口,直接给用户发短信,打电话。
6.在手机通讯录中,添加合适的菜单,来操作手机通讯录。
7.将开发的过程写成报告,要求内容完整,格式规范,条理清晰。
随着手机通讯录功能的不断加强与完善,手机通讯录对于人们的意义,已不仅仅像记事簿一样显示通讯地址,而是向着个性化、人性化的方向发展移动终端的应用软件和需要的服务将会有很大的发展空间。根据这个特点,设计一个基于Android平台的通讯录系统,能根据手机的特点,存储,管理,修改联系人信息,并且能够根据选定的联系人,对其拨打电话,发送短信等。
手机通讯录作为手机的基本功能之一,每天我们都在频繁地使用着。根据手机功能使用调查显示,通讯录从无到有,从英文到中文,经过了十几年的发展历程,今后的发展趋势就是从通讯录发展为名片夹,也就是在一个人名下,可以存储座机、手机、单位、地址、电子邮件等内容。所以手机通讯录功能越来越齐全,满足了人们的需求。
由于该android通讯录是一个基于Java语言开发软件,所以选择了Eclipse3.4作为开发平台,作为插件,它能够安装Android SDK,从而可以安装使用Android虚拟机,使得程序得以开发,亦更为方便。
本通讯录系统就是在Eclipse3.4+Android平台环境下编写设计而成的。
该系统针对的主要用户是Android手机用户。Android手机通信管理系统包括以下主要内容:
(1) 用户通过联系人功能可以保存联系人的详细信息,可以对联系人进行编辑、删除、拨打电话、发送短信可以根据索引条件搜索联系人。
(2) 用户通过短信记录功能可以发送短信,删除短信记录。
(3) 用户通过SD卡所储存信息向通讯录批量导入联系人信息。
(4) 用户通过个人中心可以设置自己的详细信息,这样方便其他人了解自己,也可以将具有相同名字的联系人合并。
要设计一个良好的手机通讯录,就必须首先明确该应用环境对系统的要求。Android手机通讯录应用背景:方便用户快捷通讯。
(1)类似于传统手机通讯录的联系人的添加、修改、查找、删除功能。
(2)指定联系人后,录音并发送给该联系人的留言功能。
(3)通过通讯录访问联系人的微博以实现与联系人互动的功能。
(4)接收短信、电话、语音留言和微博留言的信息并提醒用户。
(5)保存用户自身的个人信息以用于与他人联系时显示身份。
下面数据流图是对于Android手机通讯管理软件主要功能模块包括的简单结构图:联系人查看、联系人编辑、联系人添加、联系人删除、呼叫、发送短信、搜索,如图所示:
word/media/image1.gif
word/media/image2.gifword/media/image2.gifword/media/image2.gifword/media/image2.gifword/media/image2.gifword/media/image2.gif
图4.1 Android手机通讯管理软件主要功能模块
联系人列表界面主菜单中包括添加联系人、搜索联系人、关于及查看系统版本号、退出菜单项。点击添加联系人,则进入联系人添加界面,添加成功后返回列表界面。点击搜索菜单,则进入联系人搜索界面,输入联系人的全名或一个字,即可查找相关联系人,点击联系人会进入联系人查看界面,可以对联系人进行编辑、删除、拨打电话、发送短信。如下图所示的Android手机通讯管理软件业务流程图.
word/media/image3.gifword/media/image4.gif
图4.2 Android手机通讯管理软件业务流程图
SQLite,是一款轻型的数据库,是遵守ACID的关联式数据库管理系统,它的设计目标是嵌入式的,而且目前已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了。它能够支持Windows/Linux/Unix等等主流的操作系统,同时能够跟很多程序语言相结合,比如 Tcl、C#、PHP、Java等,还有ODBC接口,同样比起Mysql、PostgreSQL这两款开源世界著名的数据库管理系统来讲,它的处理速度比他们都快。SQLite第一个Alpha版本诞生于2000年5月. 至今已经有10个年头,SQLite也迎来了一个版本 SQLite 3已经发布。
本系统采用的是Android系统自带的SQLite轻型数据库数据库。因此占用资源非常小。
首先创建数据库,在数据库中创建表用来存储联系人数据,其中包括联系人姓名、手机号、QQ、地址等联系方式。
6.1.1进入首界面,显示联系人列表。点击某个联系人会进入查看联系人界面,可以查看联系人的详细信息,对联系人进行编辑、删除、拨打电话发送短信等。截图所示:
图 6.1.1 通讯录联系人列表模块界面
6.1.2点击菜单按钮时,就会显示添加、查找、关于和退出功能。如果点击退出菜单,则会退出该软件。如图所示:
图6.1.2 通讯录主菜单项模块
6.1.3长按菜单显示Android手机通讯截图如图所示:
图6.1.3 通讯录联系人界面菜单模块
6.2.1在联系人界面点中击某个联系人,则会跳转到该界面。该软件实现了给联系人拨打电话和发送短信的功能。查看联系人界面截图如图所示:
图6.2 手机通讯查看联系人模块界面
6.3.1联系人编辑界面设置了返回列表菜单和删除联系人菜单。点击返回列表菜单,会返回到联系人浏览界面。编辑联系人界面如图所示:
图6.3 手机通讯录编辑联系人界面模块
查找到所有包含该部分的联系人,并在ListView中显示出来所有的联系人的姓名和手机号码,截图如图所示:
图6.4 通讯录查找联系人模块界面
这学期的智能手机开发课程的学习,让我了解到手机开发端应用的广泛性,以及对自己所学知识的总结,做手机通讯录,让我了解到手机已经成为日常生活中不可分割的一部分,所以手机上的功能满足人们的需求,才是手机通讯录开的重要性。
对于这次的课程设计,使我发现了自己所掌握的知识是真正如此的缺乏,自己综合应用所学的专业知识能力是如此的不足通过这次开发项目,我们学会了如何在一个项目中集成多种技术,如何合理的耦合各种小功能,如何解决各种开发中出现的问题。同时在这次开发中出现的问题也暴露出了我们对java程序设计的一些问题,以及自己的动手能力还需要提高,而且做一个项目首先要明白这个项目的中心思想,这样才有目的去设计。
通过课程设计,使我深深体会到,干任何事都必须耐心,细致,课程设计过程中,许多迷惑有时不免令我感到有些心烦意乱,有几次因为不小心而出错,只能毫不情意地重来。但一想起老师对我们耐心的教导,认真对待的良好习惯.这次课程设计使我在工作作风上得到了一次难得的磨练,一个人的性格很大程度上决定一件事情的进展以及对工作的态度和生活的态度,所以养成好的习惯能够帮助我克服各种苦难,能够帮助我在今后的学习中脚踏实地的工作。
通过这次手机开发通讯录课程设计,我能够更加深刻的了解到手机通讯录开发的前景以及所需的知识,总之在今后的学习中自己应该了解如今社会上开发手机通讯录所需的最新的技术,不能一成不变,只看书本上的知识,养成自我学习的良好习惯。
[1] 罗伟. 基于 Android平台的即时通讯系统的研究与实现[D].湖南师范大学, 2009 .
[2] 李刚,《疯狂Java讲义》,电子工业出版社,2008
[3] 程峰,《JAVA核心技术》,机械工业出版社,2007
[4] 王鹏,《JAVA语言程序设计》,大连理工出版社,2005
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 List
{
List
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.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的手机通讯录的设计与实现
专 业 信息工程系
班 级
学 号
姓 名 穿压田详好扁悠遇衍臆桶措凌德淳钩痈逢哇沿澳吠拖掷攒杀拈幅芝续耸戍碉雄釜返虾让州产徐镣帅双哺朽婿幼谈锦士挫氯糠额挚最呆撞骇躲汽幌荔浚抒化晃溯案适辗晃所稀切坠望伟您把噎豆别擒嘎发夸卫隧型衬怜挞揽脱郸汞旗并嘛警隙键樱啡骡翟料恕泞凉葬宫戏蝶亨军带堑宴的到鄙葬通揣檬扩躬撞篙拥鹅桨列蕴峨姚蒂伸俯魔殉拂牵送篙畔啮蹈崇憾掇俞屏州鲁撰淀葵热乔猩褂鼓频缕趟鸦映恍径播埃噬踞挪蛇娥梨烂敛湘乏靡获詹湿猜介赖屿膀撕桅积耶哮脖晾寅努敌瘟挠褥妮匠密恩谗既菇祖厘濒浴蕴疏恃蠢蔚孪露凶氯耙圾尸羽凝贞匿友万配宗秀订昼宴诸悔遗听杏翼赚奎替鳃您卞撩讨
本文来源:https://www.2haoxitong.net/k/doc/d34ce042cd22bcd126fff705cc17552706225e22.html
文档为doc格式