基于android的手机通讯录(附程序)

合集下载

Android添加联系人到通讯录的方法

Android添加联系人到通讯录的方法

Android添加联系⼈到通讯录的⽅法⽬录字段联系⼈名字联系⼈昵称联系⼈头像联系⼈备注联系⼈号码联系⼈公司和职位⽹站联系⼈邮箱联系⼈地址添加⽅式1. 静默添加2. 跳转添加3. 添加到现有联系⼈权限字段联系⼈名字名字不知道为什么,值设置了之后传过去没有,于是⾃⼰通过 Intent 最后⼜单独传了⼀次// 联系⼈名字ContentValues row1 = new ContentValues();String name = lastName + middleName + firstName;row1.put(ContactsContract.Data.MIMETYPE, monDataKinds.StructuredName.CONTENT_ITEM_TYPE);row1.put(monDataKinds.StructuredName.DISPLAY_NAME, name);row1.put(monDataKinds.StructuredName.GIVEN_NAME,firstName);row1.put(monDataKinds.StructuredName.FAMILY_NAME,lastName);row1.put(monDataKinds.StructuredName.MIDDLE_NAME,middleName);联系⼈昵称ContentValues row2 = new ContentValues();row2.put(ContactsContract.Data.MIMETYPE, monDataKinds.Nickname.CONTENT_ITEM_TYPE);row2.put(, nickName);联系⼈头像这⾥需要将图⽚的 byte 数组传进去ContentValues row3 = new ContentValues();//添加头像row3.put(ContactsContract.Data.MIMETYPE, monDataKinds.Photo.CONTENT_ITEM_TYPE);Bitmap bitmap = BitmapFactory.decodeFile(photoFilePath);ByteArrayOutputStream baos = new ByteArrayOutputStream();press(pressFormat.JPEG, 100, baos);row3.put(monDataKinds.Photo.PHOTO, baos.toByteArray());联系⼈备注// 联系⼈备注ContentValues row4 = new ContentValues();row4.put(ContactsContract.Data.MIMETYPE, monDataKinds.Note.CONTENT_ITEM_TYPE);row4.put(monDataKinds.Note.NOTE, remark);联系⼈号码号码有很多种类型,电话,⼿机,传真,公司,家庭,等ContentValues row5 = new ContentValues();// 联系⼈的电话号码addPhoneNumber(row5, values, mobilePhoneNumber,monDataKinds.Phone.TYPE_MOBILE);ContentValues row6 = new ContentValues();// 联系⼈的公司电话addPhoneNumber(row6, values, hostNumber,monDataKinds.Phone.TYPE_COMPANY_MAIN);ContentValues row7 = new ContentValues();// 联系⼈的⼯作号码addPhoneNumber(row7, values, workPhoneNumber,monDataKinds.Phone.TYPE_WORK_MOBILE);ContentValues row8 = new ContentValues();// 联系⼈的⼯作传真addPhoneNumber(row8, values, workFaxNumber,monDataKinds.Phone.TYPE_FAX_WORK);ContentValues row9 = new ContentValues();// 联系⼈的住宅号码addPhoneNumber(row9, values, homePhoneNumber,monDataKinds.Phone.TYPE_HOME);ContentValues row10 = new ContentValues();// 联系⼈的住宅传真addPhoneNumber(row10, values, homeFaxNumber,monDataKinds.Phone.TYPE_FAX_HOME);//封装的添加⽅法private void addPhoneNumber(ContentValues row, ArrayList<ContentValues> values, String phoneNumber, int type) {row.put(ContactsContract.Data.MIMETYPE,monDataKinds.Phone.CONTENT_ITEM_TYPE);row.put(monDataKinds.Phone.NUMBER, phoneNumber);row.put(monDataKinds.Phone.TYPE, type);values.add(row);}联系⼈公司和职位// 联系⼈公司和职位ContentValues row11 = new ContentValues();row11.put(ContactsContract.Data.MIMETYPE, anization.CONTENT_ITEM_TYPE);row11.put(PANY, organization);row11.put(anization.TITLE, title);⽹站// 联系⼈⽹站ContentValues row12 = new ContentValues();row12.put(ContactsContract.Data.MIMETYPE, monDataKinds.Website.CONTENT_ITEM_TYPE);row12.put(monDataKinds.Website.URL, url);联系⼈邮箱// 插⼊Email数据ContentValues row13 = new ContentValues();row13.put(ContactsContract.Data.MIMETYPE, monDataKinds.Email.CONTENT_ITEM_TYPE);row13.put(monDataKinds.Email.DATA, email);row13.put(monDataKinds.Email.TYPE, monDataKinds.Email.TYPE_WORK);联系⼈地址地址分为家庭,⼯作和其他。

全省优秀学位论文评选获奖论文

全省优秀学位论文评选获奖论文
彭红霞
陈黎
2012年
73
时间依赖性抗菌药物不同给药方案疗效分析
罗小鹏
李雪芹
2012年
74
静注曲马多对七氟醚吸入麻醉苏醒期躁的预防
李秀芳
龚小芳
2012年
75
罗哌卡因联合芬太尼与联合曲马多在硬膜外分娩镇痛中应用效果的比较
刘莉
杨磊
2012年
辛雅冰
韩燕红
2010年
6
HPLC法测定清胰方中龙胆苦苷和大黄素的含量
胡婷
梁奋新
2010年
7
关于留置导尿患者护理需求的调查
倪荆为
黄敏
2010年
8
HPLC-MS/MS串联法检测人血浆中辛伐他汀浓度
王方
任秀华
2010年
9
注射用泮托拉唑钠与18种常用药物配伍稳定性考察
陈光辉
朱雪松
2010年
10
基于Delphi的小区物业管理系统的设计与实现
余宝娣
周尚成
2012年
68
HPLC 同时测定肠循环液中黄连提取物小檗碱和药根碱的浓度
李发鹏
徐丽君
2012年
69
脑康复粉针对大鼠MCAO模型血脑屏障的影响
付赛兵
邢茂
2012年
70
医疗损害赔偿的法律适用问题研究
马燕芳
李泽华
2012年
71
正交试验优化醋炙香附的电烤炮制工艺
杨娜娜
张晓燕
2012年
72
HPLC法测定固肾调经片中芍药苷的含量
全省优秀学位论文评选获奖论文
序号
论文题目
作 者
指导教师
时间
1
N-三甲基壳聚糖包衣的盐酸阿霉素脂质体的制备

基于互联网的手机通讯录的研究与实现

基于互联网的手机通讯录的研究与实现

基于互联网的手机通讯录的研究与实现林俊存;张华;谭伟【摘要】本系统采用Eclipse+Android+sdk+Cordova集成开发环境,运用Java 语言编程,使得用户只需通过手机浏览器就能实现任何时间,任何地方,任何手机拨打您所急需的联系人,一般使用时不需要下载任何手机app,主要解决了手机丢失,手机不在,手机关机等各种情况下需要对联系人进行及时的拨打,新建或者分享他人等需求.及解决了我们对手机客户端的依赖及手机系统的跨平台性,是一个面向所有用户的WebApp网页软件,使我们对联系人的获取及其他功能的操作变得更简单,更实用,更及时.【期刊名称】《电子世界》【年(卷),期】2016(000)023【总页数】2页(P9-10)【关键词】SSH整合;Cordova;JAVA语言;手机通讯录;移动互联网【作者】林俊存;张华;谭伟【作者单位】湖北民族学院信息工程学院;湖北民族学院信息工程学院;湖北民族学院信息工程学院【正文语种】中文如今在互联网技术的带动下,大数据及云端技术得到了快速发展,而手机面向这种技术将成为手机科技发展的必定趋势,手机是人们在生活中必不可少的工具,其设计的最初目的与最为重要的功能是为了方便联系。

我们不得不承认百度云盘的出现是一件多么美妙的事,但我们并不想下载手机客户端来存放我们的联系人,在某种情况下它是没有多大意义的。

近几年来,随着移动通信智能终端的普及和通信终端功能的不断增强,用户已经可以随时随地使用移动终端登录和访问互联网上的各种社区网站;另外,移动通信终端都存储有通讯录,现在大部分基于手机通讯录的应用也主要是针对因用户手机丢失而引起用户信息损失的通讯录备份功能,完全忽视了通讯录所代表和隐藏的潜在的社会网络关系。

手机通讯录可以说是我们手机中最重要的应用功能之一,特别是我们在更换手机的时候,首先要做的就是把旧手机上面的联系人更新到新手机上面去,以前碰到这个问题我们可能用得最多的是通过复制到SIM卡,再从SIM卡复制到新手机的方式,但是这个方法往往会受到数量以及新旧手机联系人不兼容的问题,并且最重要的是这个方法很慢。

android获取通讯录信息

android获取通讯录信息

开发中需要获取手机用户的通讯录信息,要求运行在Andrid2.0及以上版本,因为程序中用到了Android2.0新的API。

程序运行结果通过Log.v写入到了日志,结果部分截图:程序的主要代码如下:protected void getContactInfo() {//获得通讯录信息,URI是ContactsContract.Contacts.CONTENT_URICursor cursor = getContentResolver().query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null);while (cursor.moveToNext()) {//获得通讯录中每个联系人的IDString contactId = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID));//获得通讯录中联系人的名字String name = cursor.getString(cursor.getColumnIndexOrThrow(ContactsContract.Contacts.DISPLAY_NAM E));Log.v(TAG, "…name…" + name);//查看给联系人是否有电话,返回结果是String类型,1表示有,0表是没有String hasPhone = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER) );if (hasPhone.equalsIgnoreCase("1"))hasPhone = "true";elsehasPhone = "false";//如果有电话,根据联系人的ID查找到联系人的电话,电话可以是多个if (Boolean.parseBoolean(hasPhone)) {Cursor phones = getContentResolver().query(monDataKinds.Phone.CONTENT_URI,null,monDataKinds.Phone.CONTACT_ID+ " = " + contactId, null, null);while (phones.moveToNext()) {String phoneNumber = phones.getString(phones.getColumnIndex(monDataKinds.Phone.N UMBER));Log.v(TAG, "…phoneNumber…" + phoneNumber);}phones.close();}//查找email地址,这里email也可以有多个Cursor emails = getContentResolver().query(monDataKinds.Email.CONTENT_URI,null,monDataKinds.Email.CONTACT_ID + " = "+ contactId, null, null);while (emails.moveToNext()) {String emailAddress = emails.getString(emails.getColumnIndex(monDataKinds.Email.DATA ));Log.v(TAG, "…emailAddress…" + emailAddress);}emails.close();//获得联系人的地址Cursor address = getContentResolver().query(monDataKinds.StructuredPostal.CONTENT_ URI,null,monDataKinds.StructuredPostal.CONTACT_ID+ " = " + contactId, null, null);while (address.moveToNext()) {// These are all private class variables, don’t forget to cre ate// them.String poBox = address.getString(address.getColumnIndex(monDataKinds.StructuredP ostal.POBOX));String street = address.getString(address.getColumnIndex(monDataKinds.StructuredP ostal.STREET));String city = address.getString(address.getColumnIndex(monDataKinds.StructuredP ostal.CITY));String state = address.getString(address.getColumnIndex(monDataKinds.StructuredP ostal.REGION));String postalCode = address.getString(address.getColumnIndex(monDataKinds.StructuredP ostal.POSTCODE));String country = address.getString(address.getColumnIndex(monDataKinds.StructuredP ostal.COUNTRY));String type = address.getString(address.getColumnIndex(monDataKinds.StructuredP ostal.TYPE));Log.v(TAG, "…city…" + city);}}cursor.close();}代码中已经有了注释,这里不做过多解释,比较重要的方法getContentResolver().query在文章Android简单操作sqlite中有解释。

安卓课程设计_手机通讯录系统1

安卓课程设计_手机通讯录系统1

目录1摘要 (1)2系统概述 (2)2.1需求分析 (2)2.1.1基本功能需求 (2)2.1.2系统用例分析 (2)2.2总体设计方案 (5)2.2.1系统模块关系与划分 (5)3系统详细分析 (6)3.1通讯录需求分析 (6)3.1.1增加、删除、编辑联系人 (6)3.1.2查找联系人 (6)3.1.3通讯功能 (6)3.1.4菜单功能 (7)3.1.5导入导出功能 (7)3.2数据库设计 (7)3.1.3Android数据库概述 (7)3.1.3数据库表详细设计 (7)3.3系统界面设计 (8)4系统编码实现 (14)5测试 (19)6参考文献 (23)摘要Android是一种以Linux为基础的开源代码操作系统,主要应用于手机,因为其良好的人机交互能力和能够安装使用众多功能各异的应用软件而深受人们喜爱,本文就介绍其基于Android 2.1版本开发的一个“个性通讯录”。

根据当下人们的使用习惯和实际需求,本文对通讯录提出了新的构想和设计,并在这样的基础上,构建实现了该通讯录.【关键词】 Android Linux 手机通讯录AbstractAndroid is a sort of open source code operating system that base on the Linux, and mainly used by mobile phone. It is so popular because of the good human-machine interaction capability, and also there are all kinds of functional applications software can be installed that through by this operating system, this article will introduces a kind of contacts that bases on the Android 2.1 version., this article pointed out an new idea and design for contacts due to the people’s operating habits and particular demands, and on such a basis to construct and achieve this contacts.function to ensure the security and stability of the system effectively.【Keywords】 Android Linux mobile contacts第1章系统概述1.1需求分析1.1.1基本功能需求(1) 用户通过联系人功能可以保存联系人的详细信息,可以对联系人进行编辑、删除、拨打电话、发送短信可以根据索引条件搜索联系人。

企业战略管理习题及参考答案

企业战略管理习题及参考答案

企业战略管理习题集及参考答案《企业战略管理》课程建设组二O一三年四月编写说明企业战略管理是工商管理专业的核心主干课程,同时也是财务管理、旅游管理、公共管理等相关管理类专业的必修课程。

企业战略管理主要研究和介绍企业从战略角度生存和发展所涉及的基本概念、基本原理和基本方法,突破了以往的管理理论发展中只反映企业某一职能管理的局限性,对企业全面的、长期的和方向性的管理问题及解决方法进行了充分阐述。

为了反映企业战略管理学科在理论与方法方面的最新发展动态,云南财经大学商学院工商管理教研室组织编写了由杨增雄教授任主编,卢启程教授、陈昆玉教授、史惠华副教授、唐泳副教授任副主编,2012年12月科学出版社出版的《企业战略管理——理论与方法》教材。

为了便于教师授课和学生学习,教研室又组织相关老师编写了这本与教材匹配的习题集及参考答案,以期对教师教学和学生学习把握相关理论和知识点有所帮助,也希望有助于学生课后复习和练习。

本习题集及参考答案编写人员及分工如下:杨增雄教授(第一、二、七、十一、十二章)、史惠华副教授(第三、九章)、唐泳副教授(第四、六章)、陈昆玉教授(第五、十章)、卢启程教授(第八、十三章)。

商学院相关研究生也参与了习题集的编写工作,在此对他们的辛勤工作表示感谢!由于知识水平有限,本习题集及参考答案存在问题在所难免,恳请各位使用者批评指正,对此将不胜感谢!第一篇企业战略管理基本问题第一章企业战略管理概论一、单项选择题1、亨利明茨伯格从计划、计策、()、定位和观念提出了企业战略的5P模型。

A、手段B、模式C、行为D、配置2、战略决策本身的风险要求企业必须适应动荡的环境,这体现了企业战略的()特征。

A、灵活性B、合作性C、竞争性D、适应性3、从本质上讲,()决定公司如何在选定的产品市场领域中进行竞争,明确并确保公司在该领域的细分市场中的良好前景。

A、经营战略B、公司战略C、职能战略D、竞争战略4、战略管理过程包括四个阶段:()、战略分析、战略选择和战略实施。

基于android企业内部通讯录设计与实现

基于android企业内部通讯录设计与实现

基于android的企业内部通讯录的设计与实现背景和意义智能手机(smartphone)是指“像个人电脑一样,具有独立的操作系统,可以由用户自行安装软件、游戏等第三方服务商提供的程序,通过此类程序来不断对手机的功能进行扩充,并可以通过移动通讯网络来实现无线网络接入的这样一类手机的总称”。

是一种安装了相应开放式操作系统的手机。

通常我们使用的智能手机操作系统有:symbian、ios、android、windows phone等。

而根据最近谷歌、苹果等公司陆续公布了2012年第四季度的财报,可以看到,目前的智能手机市场,基本是android和ios两大系统的天下,尤其是android系统,凭借免费的特点,成为了许多厂商制造手机的首选系统。

著名数据分析机构idc在2012年第三季度公布的数据表示,android系统已经占有了全球智能手机75%的市场。

而排在第二位的则是苹果的ios系统,占有了14。

9%的市场。

在这两大系统背后则是黑莓、windows phone以及塞班系统。

智能手机的普及极大的方便了人们的日常生活,越来越多的传统门户及应用软件加入了智能手机平台终端应用里头,常见的如美团、去哪儿、新浪微博等都针对智能手机进行了相应软件的开发。

通常单位的通讯录为了方便人查阅和随身携带,一般采用印制的方式,然后装订成册。

可以长期保存。

但是这种方式也存在一些问题,如印制错误照成资源浪费、联系人电话变更后无法及时更改等。

在信息技术高速发展的今天,采用电子通讯录的方式记录员工电话,既能降低办公成本,又能实时更新、提高通讯录的正确率。

基于android的内部通讯录,采用目前市场占有率最高的android手机为客户端,通过服务端统一的webservice接口查询员工信息,使院内员工可以方便快速的查询人员电话,并可采用快捷方式拨打电话、发送短信、导入本地通讯录。

同时服务器端维护人员,可以根据具体情况对人员手机号码等信息进行维护,并实时共享发布到平台上,使员工手机上的通讯录保持统一性。

Android开发之获得通讯录及SIM卡中联系人

Android开发之获得通讯录及SIM卡中联系人

Android开发之获得通讯录及SIM卡中联系人Android手机的通讯录联系人全部都存在系统的数据库中,如果须要获得通讯里联系人的信息就须要访问系统的数据库,才能将信息拿出来。

这一篇文章我主要带领同学们熟悉Android的通讯录机制。

图中选中的数据库 contacts2.db就是系统储存联系人的数据库,我们将它打开看看里面储存了些什么东东?打开contacts.db后发面里面有一堆表,同学们先别慌张。

今天我们主要讨论红框内的4个比较常用的表,后期我在介绍其它表的使用。

这里说一下如果你想在真机上查看数据库的话必需要先获得root权限,否则无法查看。

1.contacts 表_id :表的ID,主要用于其它表通过contacts 表中的ID可以查到相应的数据。

display_name: 联系人名称photo_id:头像的ID,如果没有设置联系人头像,这个字段就为空times_contacted:通话记录的次数last_time_contacted: 最后的通话时间lookup :是一个持久化的储存因为用户可能会改名子但是它改不了lookup2.data表raw_contact_id:通过raw_contact_id可以找到 raw_contact表中相对的数据。

data1 到 data15 这里保存着联系人的信息联系人名称联系人电话号码电子邮件备注等等。

3.phone_look_up表data_id : 通过data_id可以找到 datat表中相对的数据。

raw_contact_id : 通过raw_contact_id 可以找到 raw_contact_表中相对的数据。

normalized_number: 这个字段就比较有意思了,它是将每个电话号码逆序排列。

4.raw_contact表version :版本号,用于监听变化deleted :删除标志, 0为默认 1 表示这行数据已经删除display_name : 联系人名称last_time_contacts : 最后联系的时间有关这些的源码都在android.provider.ContactsContract这个类里面,如果想深入了解的话可以去看看,数据库相关的操作联查啊啥的都在里面。

基于android的手机通讯录(附程序)

基于android的手机通讯录(附程序)

20xx-20xx 学年 x 学期xxxx大学电工电子实验教学中心创新性实验研究报告实验项目名称_基于android的手机通讯录_组长姓名xxx 学号xxxxxxxxxxxxxxx联系电话xxxxxxxxxxxx *************************成员姓名xxx 学号xxxxxxxxxxxxx成员姓名xxx 学号xxxxxxxxxxxxxxx专业电子信息工程班级20xx级x班指导教师及职称xx20xx年x月x 日开发流程见下图:1、增加、删除、编联系人点击通信录界面中的增加按钮,入增加联系人面。

输入联系人的基本信息,并可根据用户需求增加个性化信息如头像、姓名、手机号码、办室电话、家庭电话、职务职称、单位名称、地址、邮政编码、Email、其他联系方式、备注这些信息,击确认返回主界面。

点击通信录中一个已存在的联系人,进入联系人编辑界面,可修改系人的资料或进行删除联系人操作,完成后退回到主界面。

对列表中联系人的标记,点mnu键弹出功能界面上的删除按键也可进行删除。

还可以在菜单上选择删除全部联系人清空通讯录。

在删除联系人的过程中,系统将提示用户是否继续操作,若放弃操作,则系人信息将继续保存。

2、查找联系人用户点击menu键打开底部菜单框,底部菜单框为查询系人提供入口,进入通讯录的缺省页面为联系人列表,在列表中看到所有联系人的姓名、电话息排列,用户点击查找按键输入联系人基本信息,通讯录显所有符合查询条件的联系人列表,用户选择一个联系人进入联系人基本信息页面进行其他操作;查询完成,用户按返回键返回主界面。

3、通功能用户在通录选择联系人进入联系详细信息界面,这时点击menu键打开通信功能框,选择打电话、发信息的功能进行操作。

4、菜单能通过对menu按的点击,显示底部菜框,包含有增加查找、除、菜单、返回功能,菜单按键则包含显示所有、删除所有等实用功能。

五、实验结果与分析通讯录界面要求布局合理简约,颜色舒,控制按钮简单明了,让用户一眼就能看出各个按钮的作用及操方法。

Android手机通讯录的设计与分析_刘橙

Android手机通讯录的设计与分析_刘橙

1、引言移动终端的高速发展,使得人们对手机应用的需求更加显著。

根据手机功能使用调查显示,有八成以上的消费者使用手机通讯录功能频繁。

作为手机基本功能之一,手机通讯录的易用性与适应性,直接影响着用户对手机功能使用的满意度。

随着Android 手机操作系统的迅速兴起,能够更好的满足用户需求的通讯录显得尤为重要。

虽然Android 自带了具有一定功能的通讯录软件,可是存在着拨号时没有号码联想、缺乏个性化设置等诸多不足,常常让用户难以适应。

Android 的自由及开源,为手机通讯录系统的开发设计提供了简单可行的策略。

本文的目标即是开发基于Android 的手机的通讯管理软件。

以Java 语言为基础,结合Android 移动开发平台,利用Android 提供的SDK ,实现在Android 平台上运行的手机通讯录。

该手机通讯录面向所有Android 手机用户,能够提供实际便捷的手机服务。

除具有增、删、改、查等通讯录基本功能外,通讯录的数据备份与还原功能是该系统的一大特色,另外,增加的“个人空间”功能让用户可设立私密联系人,访问需要用户口令验证,避免了生活工作当中遇到的手机丢失、出现故障等重要联系人信息被人窃取利用的情况。

2、系统设计2.1技术准备2.1.1Android 开发四大组件1.活动(Activity):用于表现功能。

Activity 是所有程序的根本,所有程序的流程都运行在Activity 之中,Activity 可以算是开发者遇到的最频繁,也是Android 当中最基本的模块之一。

2.服务(Service):后台运行服务,不提供界面呈现。

Service 是android 系统中的一种组件,它跟Activity具有相似级别,它们只能后台运行,而且能与其他相关组件交互。

Service 是一种可长时间运行的程序,但是它却没有用户界面。

3.广播接收器(BroadcastReceiver):用于接收广播。

基于Android平台的手机通讯录管理系统

基于Android平台的手机通讯录管理系统

第一章绪论1.1 工程研究背景经过多年的开展,随着第三代网络的使用及四代网络的即将来了呢,移动终端不再仅是通讯网络的终端,还将成为互联网的终端。

因此,移动终端的应用软件和需要的效劳将会有很大的开展空间。

Google与包括HTC、摩托罗拉、三星、联想等在内的三十多家技术和无线应用的领军企业组成的开发联盟为此于2007年11月退出了一份专为移动设备设计的软件平台——Android OS。

Android 是一套真正意义上的移动性设备综合平台,它包括操作系统、中间件和一些关键的平台应用。

Android的Java程序运行环境包含一组Java核心函数库及Dalvik虚拟机,它们有效地优化额Java程序的运行过程。

Android 系统平台基于优化了的Linux内核,它提供诸如内存管理、进程管理、设备驱动等效劳,同时也是硬件的连接层。

Abdroid平台的开放性等特点既能促进技术〔包括平台本身〕的创新,又有助于降低开发本钱,还可以是运营商能非常方便地制定特色化的产品,因此,它具有很大的市场开展潜力。

1.2 工程研究的目的及意义随着3G网络的使用,移动终端不再仅是通讯网络的终端,还将成为互联网的终端。

因此,移动终端的应用软件和需要的效劳将会有很大的开展空间。

在Google和Android 联盟的共同推动下,Android在众多操作系统中脱颖而出,受到广阔消费者的欢送。

通讯录作为的根本功能之一,每天我们都在频繁地使用着。

根据功能的不断加强与完善,通讯录对于人们的意义,已经不仅仅像记事簿一样显示通讯地址,而是向着个性化、人性化的方向开展。

通讯录从无到有,从英文到中文,经过了十几年的开展历程,今后的开展趋势就是从通讯录开展为名片夹,也就是一个人名下,可以储存座机、、单位、地址、电子邮箱等内容,这种名片夹在薄的根底上,大大丰富了内容,同时结构也发生了革命性的的变化,而且随着的开展,相信更优秀的通讯录会越来越受到社会各层认识的喜爱。

(毕业设计)基于Android通讯录的设计与实现

(毕业设计)基于Android通讯录的设计与实现

毕业论文(设计)题目基于Android通讯录管理系统设计与实现学生姓名学号学院专业指导教师联系QQ 1912881988本人严重声明:1、持以“求实、创新”的科学精神从事研究工作。

2、本文是我个人在导师指导下进行的研究工作和取得的研究成果。

3、本文除引文外,所有实验、数据和有关材料均是真实的。

4、本文除引文和致谢内容外,没有抄袭其他人或其他机构发表或撰写过的研究成果。

作者签名:__________日期:__________目录1 绪论 (1)1.1 手机通讯录管理系统的开发背景 (1)1.2 手机通讯录管理系统的研究目的和意义 (1)1.3 系统主要实现内容及实现方式 (1)1.3.1系统主要实现功能 (1)1.3.2 Android系统的开发平台 (2)1.4 系统开发所需的技术支持 (2)1.4.1 Java开发语言 (2)1.4.2 Android简介 (3)2 手机通讯录管理系统分析 (3)2.1技术可行性分析 (3)2.2 经济可行性分析 (4)2.3 需求可行性 (4)3 系统概要设计 (4)3.1 总体功能设计 (4)3.2 系统流程设计 (5)3.2.1 业务流程图 (5)3.3 系统数据库简介与设计 (6)3.3.1 SQLite数据库简介 (6)3.3.2 系统数据库设计 (6)4 系统详细设计 (7)4.1 联系人模块 (7)4.1.1 联系人操作模块 (7)4.1.2 联系人查找模块 (9)4.2 信息模块 (10)4.2.1 信息显示模块 (10)4.2.2 信息编辑模块 (10)4.3 个人中心模块 (12)5 系统测试与调试 (13)5.1 测试的概念 (13)5.2测试的目的 (13)5.3 测试的原则 (13)5.4程序测试 (14)5.5 测试的主要内容 (14)5.6 测试用例 (14)5.7 系统测试结果 (15)5.7.1 编辑联系人功能测试 (15)5.7.2 查找联系人功能 (16)5.7.3 删除联系人测试 (16)5.7.4 短信息发送测试 (17)5.7.5 短信息删除测试 (17)5.7.6 备份功能测试 (17)5.8 测试总结 (18)6 总结 (18)参考文献: (19)致谢 (20)基于Android通讯录管理系统设计与实现摘要:随着科学技术的不断进步与发展,移动便携式设备,如手机,平板电脑等产品越来越普及,其中大部分产品的操作系统采用的Android操作系统,并且自Alphabet收购安卓系统后,安卓的市场份额急剧扩大并且还在进一步增加。

android 通讯录源码

android 通讯录源码
<ListView 列表
android:id="@+id/lv_userlist" android:layout_above="@+id/gv_buttom_menu" android:layout_width="fill_parent" android:layout_height="wrap_content"> </ListView> </LinearLayout>
android:textSize="18sp">
</EditText>
</LinearLayout>
</RelativeLayout>
位于菜单上方
2.2 main_menu_grid.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="/apk/res/android"
android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"> <GridView
android:id="@+id/gridview" android:layout_width="fill_parent" android:layout_height="fill_parent" android:numColumns="3" android:verticalSpacing="10dip" android:horizontalSpacing="10dip" android:stretchMode="columnWidth" android:gravity="center" /> </LinearLayout>

Android通讯录小软件(可以导入手机上的联系人、发短信、打电话、增加、修改联系人等)

Android通讯录小软件(可以导入手机上的联系人、发短信、打电话、增加、修改联系人等)

Android通讯录这是本人学习android一个月以来的第一个比较实用的小程序,此程序可以读取手机自带通讯录上的所有联系人,并且可以导入到这个通讯录列表,不用用户一个一个地输入,将导入的联系人信息保存在SQLite3数据库中,还具有向指定联系人发送短信、打电话、增加、修改联系人等基本功能。

效果图如下所示:代码如下(直接复制即可掩饰效果):====================== DatabaseHelper======================= package liu.sqlite3.db;import android.content.Context;import android.database.sqlite.SQLiteDatabase;import android.database.sqlite.SQLiteOpenHelper;import android.database.sqlite.SQLiteDatabase.CursorFactory;//DatabaseHelper作为一个访问SQLite的助手类,提供两个方面的功能,//第一,getReadableDatabase(),getWritableDatabase()可以获得SQLiteDatabse对象,通过该对象可以对数据库进行操作//第二,提供了onCreate()和onUpgrade()两个回调函数,允许我们在创建和升级数据库时,进行自己的操作public class DatabaseHelper extends SQLiteOpenHelper {private static final int VERSION = 1;//在SQLiteOepnHelper的子类当中,必须有该构造函数public DatabaseHelper(Context context, String name, CursorFactory factory,int version) {//必须通过super调用父类当中的构造函数super(context, name, factory, version);// TODO Auto-generated constructor stub}public DatabaseHelper(Context context,String name){this(context,name,VERSION);}public DatabaseHelper(Context context,String name,int version){this(context, name,null,version);}//该函数是在第一次创建数据库的时候执行,实际上是在第一次得到SQLiteDatabse对象的时候,才会调用这个方法@Overridepublic void onCreate(SQLiteDatabase db) {// TODO Auto-generated method stubSystem.out.println("create a Database");//execSQL函数用于执行SQL语句db.execSQL("create table user(name varchar(20),phone text,qq text,mail text,address text)");}@Overridepublic void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {// TODO Auto-generated method stubSystem.out.println("update a Database");}}package net.yxarm;import java.util.ArrayList;import java.util.HashMap;import liu.sqlite3.db.DatabaseHelper;import android.app.Activity;import android.content.ContentValues;import android.content.Intent;import android.database.Cursor;import android.database.sqlite.SQLiteDatabase;import android.os.Bundle;import android.util.Log;import android.view.ContextMenu;import android.view.Menu;import android.view.MenuInflater;import android.view.MenuItem;import android.view.View;import android.view.ContextMenu.ContextMenuInfo;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.EditText;import android.widget.Toast;public class Add_people extends Activity {private EditText editName = null;private EditText editPhone = null;private EditText editQQ = null;private EditText editEmail = null;private EditText editAddress = null;private Button buttonAdd = null;private Button buttonCancel = null;public static int n ;//==============重写Activity中创建Activity的方法========================================@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(yout.second);editName = (EditText) findViewById(R.id.edit_name);editPhone = (EditText) findViewById(R.id.edit_phone);editQQ = (EditText) findViewById(R.id.edit_QQ);editEmail = (EditText) findViewById(R.id.edit_mail);editAddress = (EditText) findViewById(R.id.edit_address);buttonAdd = (Button) findViewById(R.id.button1_add);buttonCancel= (Button) findViewById(R.id.button2_cancel);//判断是否是修改联系人还是重新创建,修改的话将原始信息重新填写到编辑框内,然后下面根据n的值决定调用新建还是修改数据的方法Intent intent = getIntent(); //接收上一个Activity通过intent传过来的数据n = intent.getIntExtra("editpeople", 0);if(n == 1){System.out.println("----上一个Activity传进来的(editpeople)值:" + n);editName.setText(Address_Book.LIST.get(Address_Book.CLICK_ID).get("name").toString()); editPhone.setText(Address_Book.LIST.get(Address_Book.CLICK_ID).get("phone").toString());editQQ.setText(Address_Book.LIST.get(Address_Book.CLICK_ID).get("qq").toString());editEmail.setText(Address_Book.LIST.get(Address_Book.CLICK_ID).get("mail").toString());editAddress.setText(Address_Book.LIST.get(Address_Book.CLICK_ID).get("address").toString());}//设置两个按钮监听事件buttonAdd.setOnClickListener(new MyButtonOnClickListener());buttonCancel.setOnClickListener(new MyButtonOnClickListener());}//======================两个按钮监听处理事件============================================class MyButtonOnClickListener implements OnClickListener {private static final int REQUESCODE2 = 2;public void onClick(View v) {switch(v.getId()) {case R.id.button1_add: //--------------------确定添加此联系人//判断联系人是否可以添加(如:姓名不能为空、电话要有效)if(editName.getText().toString().length()>0 & editPhone.getText().toString().length()>=3 ) {CreateDatabaseHelper(); //创建数据库,将联系人信息保存到数据库(若数据库存在则不会重建)if(n != 1) { //新建联系人,若是修改联系人则不会再添加Address_Book.LIST = Insert(); //返回全部数据给LIST静态列表变量Toast.makeText(Add_people.this, "添加成功", 1).show();System.out.println(".......选择新建联系人");}else if(n == 1) { //修改联系人(n:是点击了修改联系人后传进来的值)Address_Book.LIST = modfiy(); //返回全部数据给LIST静态列表变量Toast.makeText(Add_people.this, "修改成功", 1).show();System.out.println(".......选择修改联系人");}//返回到第一个Activity中显示(所有数据已经保存在LIST静态列表变量中)Intent intent = new Intent();intent.setClass(Add_people.this,Address_Book.class);intent.putExtra("nothing2", 2);startActivityForResult(intent, REQUESCODE2);}else if(editName.getText().toString().equals("")){ //没有输入名字不能添加Toast.makeText(Add_people.this, "请输入联系人姓名", 1).show();}else if( editPhone.getText().toString().length()<3 ) { //电话无效不能添加Toast.makeText(Add_people.this, "请输入有效电话", 1).show();}break;case R.id.button2_cancel: //------------------取消此联系人的添加回到列表界面Toast.makeText(Add_people.this, "取消", 1).show();Intent intent = new Intent(Add_people.this,Address_Book.class);startActivity(intent);break;default: break;}}}//================================创建数据库==========================================public void CreateDatabaseHelper() {//创建一个DatabaseHelper对象DatabaseHelper dbHelper = new DatabaseHelper(Add_people.this,"test_mars_db");//只有调用了DatabaseHelper对象的getReadableDatabase()方法,或者是getWritableDatabase()方法之后,才会创建,或打开一个数据库SQLiteDatabase db = dbHelper.getReadableDatabase();}//===========================插入数据并返回全部数据list================================public ArrayList Insert() {//---------------插入新数据-----------------//生成ContentValues对象ContentValues values = new ContentValues();//想该对象当中插入键值对,其中键是列名,值是希望插入到这一列的值,值必须和数据库当中的数据类型一致values.put("name",editName.getText().toString());values.put("phone",editPhone.getText().toString());values.put("qq",editQQ.getText().toString());values.put("mail",editEmail.getText().toString());values.put("address",editAddress.getText().toString());DatabaseHelper dbHelper = new DatabaseHelper(Add_people.this,"test_mars_db",2);SQLiteDatabase db = dbHelper.getWritableDatabase();//调用insert方法,就可以将数据插入到数据库当中db.insert("user", null, values);//------将更新后的全部数据返回---------//定义一个键值对数组将数据返回到第一个列表Activity中更新进行显示ArrayList<HashMap<String, Object>> list = new ArrayList<HashMap<String, Object>>();DatabaseHelper dbHelper1 = new DatabaseHelper(Add_people.this,"test_mars_db");SQLiteDatabase db1 = dbHelper1.getReadableDatabase();Cursor cursor = db1.query("user", new String[]{"name","phone","qq","mail","address"}, null, null, null, null, null);while(cursor.moveToNext()){HashMap<String, Object> map = new HashMap<String, Object>();map.put("name", cursor.getString(cursor.getColumnIndex("name")));map.put("phone", cursor.getString(cursor.getColumnIndex("phone")));map.put("qq", cursor.getString(cursor.getColumnIndex("qq")));map.put("mail", cursor.getString(cursor.getColumnIndex("mail")));map.put("address", cursor.getString(cursor.getColumnIndex("address")));}return list; //返回全部数据list用于列表显示}//===========================查询所有数据=================================== public void Query(){DatabaseHelper dbHelper = new DatabaseHelper(Add_people.this,"test_mars_db");SQLiteDatabase db = dbHelper.getReadableDatabase();Cursor cursor = db.query("user", new String[]{"name","phone","qq","mail","address"},"name=?", new String[]{editName.getText().toString()}, null, null, null);while(cursor.moveToNext()){String name1 = cursor.getString(cursor.getColumnIndex("name"));String name2 = cursor.getString(cursor.getColumnIndex("phone"));String name3 = cursor.getString(cursor.getColumnIndex("qq"));String name4 = cursor.getString(cursor.getColumnIndex("mail"));String name5 = cursor.getString(cursor.getColumnIndex("address"));System.out.println("query--->" + name1);System.out.println("query--->" + name2);System.out.println("query--->" + name3);System.out.println("query--->" + name4);System.out.println("query--->" + name5);System.out.println("======================================================");}}//===========================更新(修改)数据===================================public ArrayList modfiy(){//生成ContentValues对象ContentValues values = new ContentValues();//想该对象当中插入键值对,其中键是列名,值是希望插入到这一列的值,值必须和数据库当中的数据类型一致values.put("name",editName.getText().toString());values.put("phone",editPhone.getText().toString());values.put("qq",editQQ.getText().toString());values.put("mail",editEmail.getText().toString());values.put("address",editAddress.getText().toString());DatabaseHelper dbHelper = new DatabaseHelper(Add_people.this,"test_mars_db",2);SQLiteDatabase db = dbHelper.getWritableDatabase();System.out.println("************修改联系人之前: " + Address_Book.LIST.get(Address_Book.CLICK_ID).toString());db.update("user", values, "name = ?", new String[]{Address_Book.LIST.get(Address_Book.CLICK_ID).get("name").toString()});//------将更新后的全部数据返回---------//定义一个键值对数组将数据返回到第一个列表Activity中更新进行显示ArrayList<HashMap<String, Object>> list = new ArrayList<HashMap<String, Object>>();DatabaseHelper dbHelper1 = new DatabaseHelper(Add_people.this,"test_mars_db");SQLiteDatabase db1 = dbHelper1.getReadableDatabase();Cursor cursor = db1.query("user", new String[]{"name","phone","qq","mail","address"}, null, null, null, null, null);while(cursor.moveToNext()){HashMap<String, Object> map = new HashMap<String, Object>();map.put("name", cursor.getString(cursor.getColumnIndex("name")));map.put("phone", cursor.getString(cursor.getColumnIndex("phone")));map.put("qq", cursor.getString(cursor.getColumnIndex("qq")));map.put("mail", cursor.getString(cursor.getColumnIndex("mail")));map.put("address", cursor.getString(cursor.getColumnIndex("address")));}return list; //返回全部数据list用于列表显示}}================== Address_Book=========================package net.yxarm;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import liu.sqlite3.db.DatabaseHelper;import android.app.Activity;import android.app.AlertDialog;import android.app.Dialog;import android.app.AlertDialog.Builder;import android.content.ContentResolver;import android.content.ContentValues;import android.content.DialogInterface;import android.content.Intent;import android.database.Cursor;import android.database.SQLException;import android.database.sqlite.SQLiteDatabase;import android.graphics.Color;import .Uri;import android.os.Bundle;import android.provider.ContactsContract;import android.provider.ContactsContract.PhoneLookup;import android.view.ContextMenu;import android.view.Menu;import android.view.MenuInflater;import android.view.MenuItem;import android.view.MotionEvent;import android.view.View;import android.view.ContextMenu.ContextMenuInfo;import android.view.MenuItem.OnMenuItemClickListener;import android.view.View.OnFocusChangeListener;import android.view.View.OnLongClickListener;import android.view.View.OnTouchListener;import android.widget.AdapterView;import android.widget.ArrayAdapter;import android.widget.AutoCompleteTextView;import android.widget.ListView;import android.widget.SimpleAdapter;import android.widget.Toast;import android.widget.AdapterView.OnItemClickListener;import android.widget.AdapterView.OnItemSelectedListener;public class Address_Book extends Activity {private AutoCompleteTextView autotext = null ; //快速查找时对话框中的控件autoTextViewprivate static List<String> listCheck = new ArrayList<String>(); //将所有人的名字保存这数组中实现autoTextViewprivate static final int REQUESCODE1 = 1; //Activity之间传递数据用的startActivityForResult(intent, REQUESCODE);public static int CLICK_ID = 600 ; //保存选中需要删除的id号,默认设置为600表示没选中联系人private ListView listview = null; //列表显示所有联系人数据private SimpleAdapter simpleadapter = null; //适配器public static ArrayList<HashMap<String, Object>> LIST = new ArrayList<HashMap<String,Object>>(); //静态变量,别的Activity使用要用类名引用//==============重写Activity中创建Activity的方法========================================@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(yout.first);Toast.makeText(Address_Book.this, "欢迎使用^@^", 1).show();CLICK_ID = 600 ; //返回这里是都将CLICK_ID初始化为无效值(所以没有点击联系人是不会执行删除、修改动作)//接收mainActivity通过intent传过来的数据,然后判断是否显示快速查找对话框Intent intent1 = getIntent();int n = intent1.getIntExtra("Search_flag", 0);System.out.println("MainActivity传进来的(Search_flag)值:" + n);if(n == 1) {dialogShow(); //显示对话框快速查找}//先查询所有联系人数据并显示出来LIST = Query(); //查询所有联系人并返回到listint size = LIST.size();//---------------------打印输出测试----------------------------System.out.println("---------------->>>>> " + size);for(int i=0;i<size;i++) {System.out.println( Address_Book.LIST.get(i).toString());}listview=(ListView) findViewById(R.id.listview);//注册快捷菜单(长按textView大于2秒就可以弹出快捷菜单)registerForContextMenu(listview);//取消注册//unregisterForContextMenu(textView);simpleadapter = new SimpleAdapter(this, LIST, yout.listviewitem,new String[]{"name","phone"} , new int[]{1,R.id.phone1});listview.setAdapter(simpleadapter);//(点击事件)联系人列表选中单项监听事件,将选中的位置传给静态变量CLICK_ID = position,并Toast提示语listview.setOnItemClickListener(new OnItemClickListener() {public void onItemClick(AdapterView<?> parent, View view,int position, long id) {CLICK_ID = position; //将选中列表的那个的位置传给静态变量CLICK_ID//Toast.makeText(Address_Book.this, "想"+LIST.get(CLICK_ID).get("name").toString()+"啦^@^", 1).show();System.out.println("--Click选中--CLICK_ID-:" + CLICK_ID );//点击后显示背景色绿色if (((ListView)parent).getTag() != null) {((View)((ListView)parent).getTag()).setBackgroundDrawable(null);}((ListView)parent).setTag(view);view.setBackgroundColor(Color.GREEN);}});//(选中事件)联系人列表选中单项监听事件,将选中的位置传给静态变量CLICK_ID = position,并Toast提示语listview.setOnItemSelectedListener(new OnItemSelectedListener() {public void onItemSelected(AdapterView<?> parent, View view,int position, long id) {CLICK_ID = position; //将选中列表的那个的位置传给静态变量CLICK_ID// Toast.makeText(Address_Book.this, "想"+LIST.get(CLICK_ID).get("name").toString()+"啦^@^", 1).show();System.out.println("--Selected选中--CLICK_ID-:" + CLICK_ID );//点击后显示背景色红色if (((ListView)parent).getTag() != null) {((View)((ListView)parent).getTag()).setBackgroundDrawable(null);}((ListView)parent).setTag(view);view.setBackgroundColor(Color.GREEN);}public void onNothingSelected(AdapterView<?> parent) {}});}//==============重写Activity中创建菜单的方法=============================================@Overridepublic boolean onCreateOptionsMenu(Menu menu) {//添加菜单方法2//第一个参数:组//第一个参数:id//第一个参数:排序//第一个参数:菜单名字menu.add(0,0, 0, "从手机导入联系人").setIcon(R.drawable.go);menu.add(0,1, 0, "添加联系人").setIcon(R.drawable.go).setShortcut('1', 'b'); //'b'是快捷键menu.add(0,2, 0, "快速查询").setIcon(R.drawable.jiji);menu.add(0,3, 0, "删除联系人").setIcon(R.drawable.jiji);menu.add(0,4, 0, "拨号").setIcon(oren);menu.add(0,5, 0, "发送短信").setIcon(R.drawable.jiji);menu.add(0,6, 0, "修改联系人").setIcon(R.drawable.jiji);/*//添加菜单方法3//inflater过滤器,后面的menu是public boolean onCreateOptionsMenu(Menu menu)传进来的//前面的menu是引用自己新建的menu.xml文件的ID,里面设置好了所有菜单MenuInflater inflater = getMenuInflater();inflater.inflate(R.menu.menu, menu);*/return true;}//==============重写Activity中的主菜单监听事件的方法,根据按下的菜单做相应处理============@Overridepublic boolean onOptionsItemSelected(MenuItem item) {if(item.getItemId() == 0) { //从手机中导入联系人Toast.makeText(Address_Book.this, "正在导入,请稍后···", 3).show();getContactInformation(); //将手机上的联系人导入列表Toast.makeText(Address_Book.this, "导入完成", 3).show();Intent intent = new Intent(Address_Book.this,Address_Book.class);startActivity(intent);} else if(item.getItemId() == 1) { //添加联系人,转到另一个ActivityIntent intent = new Intent();intent.setClass(Address_Book.this,Add_people.class);intent.putExtra("nothing1", 1);startActivityForResult(intent, REQUESCODE1);}else if(item.getItemId() == 2) { //快速查找,弹出对话框dialogShow(); //显示对话框快速查找}else if(item.getItemId() == 3) { //删除联系人if(CLICK_ID != 600) {dialogShow_dele();} else {Toast.makeText(Address_Book.this, "请选择需要删除的联系人", 1).show();}}else if(item.getItemId() == 4) { //拨号if(CLICK_ID != 600) {Intent intent = new Intent();Uri uri ;String data ;data = "tel:"+LIST.get(CLICK_ID).get("phone").toString();uri = Uri.parse(data);intent.setAction(Intent.ACTION_CALL);intent.setData(uri);startActivity(intent);}else {Toast.makeText(Address_Book.this, "请选择一个号码", 1).show();}}else if(item.getItemId() == 5) { //发送短信if(CLICK_ID != 600) {Intent intent = new Intent();intent.putExtra("phone_num", LIST.get(CLICK_ID).get("phone").toString()); //将选中的号码传过去intent.putExtra("name", LIST.get(CLICK_ID).get("name").toString()); //将选中的名字传过去intent.setClass(Address_Book.this, SendMessage.class);startActivityForResult(intent, 1);}else {Toast.makeText(Address_Book.this, "请选择一个号码", 1).show();}}else if(item.getItemId() == 6) { //修改联系人if(CLICK_ID != 600) {System.out.println("************点击了修改联系人: " + LIST.get(CLICK_ID).get("name").toString());Intent intent = new Intent(); //跳转到编辑Activity,并发送编辑联系人标志("editpeople", 1)intent.setClass(Address_Book.this,Add_people.class);intent.putExtra("editpeople", 1); //根据这个参数(键值对)选择是否修改还是重新创建联系人startActivityForResult(intent, REQUESCODE1);} else {Toast.makeText(Address_Book.this, "请选择需要修改的联系人", 1).show();}}return true;}//=================创建一个对话框(快速查找时会弹出)=================================private void dialogShow() {//创建一个对话框AlertDialog.Builder builder = new Builder(this);//设置图标builder.setIcon(R.drawable.jiji);//设置标题builder.setTitle("快速查找联系人").setIcon(oren);//设置文本信息builder.setMessage("请输入'空格+第一个字':").setIcon(R.drawable.jiji);//设置编辑框autotext = new AutoCompleteTextView(this);//创建一个ArrayAdapter对象ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(this,yout.autocoplist_item,listCheck);//将ArrayAdapter设置给AutoCompleteTextView对象autotext.setAdapter(arrayAdapter);builder.setView(autotext);//设置两个按钮,并设置按钮监听事件builder.setPositiveButton("确定", new MyOnClickListener());builder.setNegativeButton("取消", new MyOnClickListener());//创建显示对话框(必须)builder.create().show();}//=======对话框的"确定"、"取消"按钮监听事件处理(查找时)============class MyOnClickListener implements android.content.DialogInterface.OnClickListener {public void onClick(DialogInterface dialog, int which) {switch(which) {case Dialog.BUTTON_POSITIVE ://将查到的这个联系人找到并显示在可视界面String strname = autotext.getText().toString();listview.setSelection(listCheck.indexOf(strname));break;case Dialog.BUTTON_NEGATIVE :System.out.println("按下取消");break;}}}//=================删除时弹出一个对话框================================private void dialogShow_dele() {//创建一个对话框AlertDialog.Builder builder = new Builder(this);//设置图标builder.setIcon(R.drawable.jiji);//设置标题builder.setTitle(" 对话框").setIcon(oren);//设置文本信息builder.setMessage(" 确定删除吗?").setIcon(R.drawable.jiji);//设置两个按钮,并设置按钮监听事件builder.setPositiveButton("确定", new My1OnClickListener());builder.setNegativeButton("取消", new My1OnClickListener());//创建显示对话框(必须)builder.create().show();}//===========对话框的"确定"、"取消"按钮监听事件处理(删除时)===============class My1OnClickListener implements android.content.DialogInterface.OnClickListener {public void onClick(DialogInterface dialog, int which) {switch(which) {case Dialog.BUTTON_POSITIVE :deleteItem(); //调用上面的删除数据库中对应数据的方法System.out.println("==============删除: " + LIST.get(CLICK_ID).get("name").toString());System.out.println("-------删除联系人--------------"+CLICK_ID);break;case Dialog.BUTTON_NEGATIVE :System.out.println("按下取消");break;}}}//===========================查询所有数据==============================================public ArrayList Query() {//------将更新后的全部数据返回---------//定义一个键值对数组将数据返回到第一个列表Activity中更新进行显示ArrayList<HashMap<String, Object>> list = new ArrayList<HashMap<String, Object>>();DatabaseHelper dbHelper1 = new DatabaseHelper(Address_Book.this,"test_mars_db");SQLiteDatabase db1 = dbHelper1.getReadableDatabase();Cursor cursor = db1.query("user", new String[]{"name","phone","qq","mail","address"}, null, null, null, null, null);while(cursor.moveToNext()){HashMap<String, Object> map = new HashMap<String, Object>();map.put("name", cursor.getString(cursor.getColumnIndex("name")));map.put("phone", cursor.getString(cursor.getColumnIndex("phone")));map.put("qq", cursor.getString(cursor.getColumnIndex("qq")));map.put("mail", cursor.getString(cursor.getColumnIndex("mail")));map.put("address", cursor.getString(cursor.getColumnIndex("address")));listCheck.add(" " + cursor.getString(cursor.getColumnIndex("name")));//为了将所有人的名字保存数组中实现autoTextViewlist.add(map);}return list; //返回全部数据list用于列表显示}//===========================删除其中的一条数据===================================================public void deleteItem() {DatabaseHelper dbHelper1 = new DatabaseHelper(Address_Book.this,"test_mars_db");SQLiteDatabase db1 = dbHelper1.getReadableDatabase();db1.delete("user", "name=?", new String[]{LIST.get(CLICK_ID).get("name").toString()});System.out.println("||||||||||||||||||||删除"+LIST.get(CLICK_ID).get("name").toString()+" 成功");//删除联系人以后刷新联系人界面,跳转到当前界面,重新显示更新后的联系人列表Intent intent = new Intent();intent.setClass(Address_Book.this, Address_Book.class);startActivity(intent);}//================重写方法,添加快捷菜单,长按textView大于2秒就可以弹出快捷菜单=============================//在Activity中注册快捷菜单:registerForContextMenu(textView);@Overridepublic void onCreateContextMenu(ContextMenu menu, View v,ContextMenuInfo menuInfo) {Toast.makeText(Address_Book.this, "你想对"+LIST.get(CLICK_ID).get("name").toString()+"干嘛^@^", 1).show();menu.add("拨号").getIcon();menu.add("发送短信息").setIcon(oren);menu.add("修改联系人").setIcon(R.drawable.jiji);menu.add("删除联系人").setIcon(oren);}//===================================快捷菜单监听事件===================================================@Overridepublic boolean onContextItemSelected(MenuItem item) {if(item.toString().equals("删除联系人")) {if(CLICK_ID != 600) {dialogShow_dele();} else {Toast.makeText(Address_Book.this, "请选择需要删除的联系人", 1).show();}} else if(item.toString().equals("修改联系人")) {if(CLICK_ID != 600) {System.out.println("************点击了修改联系人: " + LIST.get(CLICK_ID).get("name").toString());Intent intent = new Intent(); //跳转到编辑Activity,并发送编辑联系人标志("editpeople", 1)intent.setClass(Address_Book.this,Add_people.class);intent.putExtra("editpeople", 1); //根据这个参数(键值对)选择是否修改还是重新创建联系人startActivityForResult(intent, REQUESCODE1);} else {Toast.makeText(Address_Book.this, "请选择需要修改的联系人", 1).show();}}else if(item.toString().equals("拨号")) {if(CLICK_ID != 600) {Intent intent = new Intent();Uri uri ;String data ;data = "tel:"+LIST.get(CLICK_ID).get("phone").toString();uri = Uri.parse(data);intent.setAction(Intent.ACTION_CALL);intent.setData(uri);startActivity(intent);}else {Toast.makeText(Address_Book.this, "请选择一个号码", 1).show();}} else if(item.toString().equals("发送短信息")) {if(CLICK_ID != 600) {Intent intent = new Intent();intent.putExtra("phone_num", LIST.get(CLICK_ID).get("phone").toString()); //将选中的号码传过去intent.putExtra("name", LIST.get(CLICK_ID).get("name").toString()); //将选中的名字传过去intent.setClass(Address_Book.this, SendMessage.class);startActivityForResult(intent, 1);}else {Toast.makeText(Address_Book.this, "请选择一个号码", 1).show();}}return super.onContextItemSelected(item);}//====================下面的3个方法,读取手机上电话联系人Contact的信息并导入列表===============================//============读取手机上电话联系人Contact的信息(为了将所有联系人导入列表)============================public void getContactInformation() {//得到ContentResolver对象ContentResolver cr = getContentResolver();//取得电话本中开始一项的光标Cursor cursor = cr.query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null);while (cursor.moveToNext()){// 取得联系人名字int nameFieldColumnIndex = cursor.getColumnIndex(PhoneLookup.DISPLAY_NAME);String name = cursor.getString(nameFieldColumnIndex);// string += (name);// 取得联系人IDString contactId = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID));Cursor phone = cr.query(monDataKinds.Phone.CONTENT_URI, null, monDataKinds.Phone.CONTACT_ID + " = "+ contactId, null, null);// 取得电话号码(可能存在多个号码)while (phone.moveToNext()){String strPhoneNumber = phone.getString(phone.getColumnIndex(monDataKinds.Phone.NUMBER));// string += (":" + strPhoneNumber);/* System.out.println("$$$获得联系人名字:" + name);System.out.println("$$$获得联系人电话:" + strPhoneNumber);System.out.println("=========================================");*/String str = Query2(name); //先判断是否存在此人if(str == null) {insret_Contant(name,strPhoneNumber);System.out.println("============可以导入--------------");} else {System.out.println("==========已经存在此人-------------");}}// string += "\n";phone.close();}cursor.close();}。

移动应用开发中的手机通讯录操作方法

移动应用开发中的手机通讯录操作方法

移动应用开发中的手机通讯录操作方法手机通讯录作为一款非常常用的应用程序,已经成为我们日常生活中的必备工具。

对于移动应用开发者来说,了解和掌握手机通讯录的操作方法是十分重要的。

本文将介绍一些常见的手机通讯录操作方法,帮助开发者能够更好地利用通讯录功能。

一、查找联系人在移动应用开发中,查找联系人是通讯录功能中最常见的操作之一。

通过在手机通讯录中查找联系人,用户可以快速找到并获取联系人的信息。

在Android平台上,开发者可以利用ContentResolver类和ContactsContract类来实现查找联系人的功能。

首先,需要获取ContentResolver对象:```ContentResolver contentResolver = getContentResolver();```然后,可以使用query()方法来查询联系人:```Cursor cursor =contentResolver.query(monDataKinds.Phone.CONTENT_URI, null, null, null, null);```最后,通过遍历Cursor对象,可以获取到每个联系人的详细信息:```while (cursor.moveToNext()) {String name =cursor.getString(cursor.getColumnIndex(monDataKinds.Phone.DI SPLAY_NAME));String phone =cursor.getString(cursor.getColumnIndex(monDataKinds.Phone.N UMBER));// 处理联系人的信息}cursor.close();```二、添加联系人除了查找联系人外,添加联系人也是通讯录功能中常见的操作之一。

在一些移动应用中,用户可以通过应用内的界面直接添加联系人,并将其保存到手机通讯录中。

在iOS平台上,开发者可以使用CNContactStore类实现添加联系人的功能。

基于Android的手机通讯录管理系统的研究与实现

基于Android的手机通讯录管理系统的研究与实现

Ke y wo r d s: An d r o i d; mo b i l e p h o n e a d d r e s s b o o k; J a v a ; E c l i p s e
0 引 言
随着 智能 手机 的逐 渐 普 及 , 人 们 对 手 机应 用 的
需 求更 加 广泛 . A n d r o i d的兴 起 , 给智 能 手 机 业 务 开
o p e d . T h i s s y s t e m u s e d J a v a l a n g u a g e, a n d wa s r e a l i z e d i n t h e E c l i p s e i n t e g r a t e d d e v e l o p me n t p l a t f o r m. T h e
di s p l a y, a d d, d e l e t e, mo d i f y a n d qu e y r o pe r a t i o n s . I t h a s a g o o d a p p l i c a t i o n p r o s pe c t .
Re s e a r c h a n d i mp l e me n t a t i o n o f mo bi l e p h o ne a d dr e s s bo o k ma n a g e me n t s y s t e m ba s e d o n Andr o i d
以得到准确快捷 的通讯录信息. 传统手机 中通讯 录
管理存 在 着数 据 少 、 浏览 和查 询 不 便 等缺 点 . 目前 , 基于 A n d r o i d操作 系统 的 手机 得 到 广 泛 应 用 , 虽 然

基于android系统的即时通讯系统设计与实现的开题报告

基于android系统的即时通讯系统设计与实现的开题报告

基于android系统的即时通讯系统设计与实现的开题报告一、选题背景与意义随着移动互联网的普及,人们对于即时通讯系统的需求越来越高。

而在移动互联网中,具有开放性与跨平台性的移动操作系统Android近年来在全球范围内广泛被应用。

故本课题拟基于Android系统设计与实现一个即时通讯系统,以帮助实现人们的即时交流需求。

本课题拟通过深入阐述Android系统相关知识与即时通讯系统的设计、通讯协议、数据加密、用户身份验证、网络连接等方面的内容,实现基于Android系统的即时通讯系统设计与实现的目标。

从而最终实现一个安全、快速、稳定、有多种功能的即时通讯系统。

二、技术方案1. 设计思路本课题采用Android Studio开发工具进行开发,具体设计思路如下:①登录页设计:正确的信息被输入,则自动跳转到主页面界面。

②主页面设计:主要分为搜索、通讯录、消息、我四个模块设计。

③消息模块设计:消息展示,包含聊天模块及通知模块设计。

④聊天模块设计:通讯录模块所列出好友的点击进入聊天面板展示,包含表情包、发送语音、发送图片等功能。

⑤通讯录模块设计:设计出添加好友、查找好友等四个模块。

⑥我的模块设计:本课题主要设计了头像更改、个人信息修改及退出登录等功能。

2. 技术关键点本课题设计的技术关键点主要有:①使用XMPP协议:采用XMPP技术实现即时通讯系统。

②数据加密:使用AES加密算法进行数据加密。

③用户身份验证:使用MD5加密算法及RSA算法验证用户身份。

④ p2p通信:使用MTX技术实现android平台间高速数据传输。

⑤数据库存储:使用SQLite数据库进行数据的存储。

三、预期成果1. 功能实现本课题预期实现的功能主要包括:①用户注册、登录、退出等基本功能。

②通讯录管理,包括好友添加、群组管理等。

③聊天功能,包括文字、语音、图片、表情等多种形式。

④消息推送功能,包括好友请求、系统通知等。

⑤个人信息管理,包括个人资料修改、头像更换等。

手机通讯录安卓课程设计

手机通讯录安卓课程设计

手机通讯录安卓课程设计1. 选题背景随着移动智能终端的普及,手机通讯录成为人们日常生活中必不可少的功能之一。

在这个背景下,本课程设计选择开发一个基于安卓平台的手机通讯录应用程序。

2. 课程设计目标通过本课程设计,学生将能够掌握以下技能:•掌握安卓应用程序开发的基本流程和技术•熟悉手机通讯录应用程序的功能和实现方式•能够使用Java语言编写安卓应用程序•能够使用Android Studio开发工具进行安卓应用程序的开发和调试3. 课程设计内容3.1 基本功能实现本课程设计的手机通讯录应用程序需要实现以下基本功能:•添加联系人•删除联系人•修改联系人信息•显示联系人列表•根据姓名或电话号码搜索联系人•拨打电话或发送短信3.2 扩展功能实现为了提高应用程序的实用性和扩展性,本课程设计还需要实现以下扩展功能:•显示联系人头像•同步联系人数据到云端或服务器•分组管理联系人•自定义联系人信息字段3.3 课程设计步骤本课程设计的实验步骤如下:1.环境搭建:学生需要安装Java开发环境和Android Studio开发工具,并配置好相关环境变量和SDK版本。

2.项目创建:学生需要创建一个新的安卓项目,并设置好项目的基本参数和开发环境。

3.页面设计:学生按照设计要求,设计应用程序的主界面和子界面,并添加相应的控件。

4.数据库设计:学生需要设计和创建联系人数据库,并编写相关的CRUD操作方法。

5.功能实现:学生需要编写相应的Java代码,实现联系人管理功能的实现。

6.调试测试:学生需要使用Android Studio工具对编写好的代码进行调试和测试,确保应用程序的稳定性和可靠性。

7.导出发布:学生需要将应用程序打包成APK文件,并发布到应用商店或其他渠道。

4. 课程设计评价学生的课程成绩将综合考虑以下方面:•功能实现的完整性和准确性•页面设计的美观性和用户体验•代码的编写规范和可读性•调试和测试的实用性和有效性•实验报告的详尽和清晰程度5.本课程设计旨在培养学生的安卓开发能力和实际编程经验,通过设计实现一个手机通讯录应用程序,让学生初步掌握安卓应用程序的开发流程和技术,并锻炼学生的编程思维和实际应用能力。

HILL 密码在基于Android 平台手机通讯录中的信息伪装应用探讨

HILL 密码在基于Android 平台手机通讯录中的信息伪装应用探讨

产能经济365HILL 密码在基于Android 平台手机通讯录中的信息伪装应用探讨段晓忠 中山大学新华学院摘要:如何有效地保护手机用户的隐私信息一直是个难题,本文着重从信息伪装的角度来探讨手机用户隐私数据的保护,着重以手机通讯录为例来探讨引入改进的HILL 密码来实现对隐私数据的保护,这种方法从源头上对诸如联系人信息等隐私数据进行加密伪装,有一定的创新和应用价值。

关键词:HILL 密码;用户隐私;信息伪装中图分类号:TP315 文献识别码:A 文章编号:1001-828X(2017)027-0365-01一、手机隐私信息加密方法介绍在基于Android 平台的手机中,用户的联系人信息、短信息、通话记录等都是以SQLite 数据库的形式存放于内置存储器的,对于这些数据的访问权限是由Android 系统的权限保护机制来控制的。

遗憾的是在低版本的Android 原生系统并没有对此类数据做加密保护的,而绝大部分应用都是有读取通讯录等隐私数据的权限请求,普通话用户由于缺乏必要的安全知识和保护意识,一般都会妥协允许这些应用的权限,这些取得用户信任的应用可能会窃取用户隐私信息,特别是手机被盗或被恶意控制或入侵后可能会导致数据库文件整体泄露。

所谓信息伪装,就是提供给盗窃者看起来和真实数据高度相似,虚假毫无价值的数据,这些数据的窃取对于用户来说非但毫无损失,对于窃取者来说,窃取得越多,它利用这些数据的时候损失就越大。

而对于像通讯录等隐私数据的伪装加密不宜采用高级的加密方法,因为那样的密文计算复杂,耗费的资源巨大,关键是密文可能跟原始数据差之甚远,达不到伪装的效果。

而对于像移位、替换、矩阵加密等方法,虽然能起到一定的伪装效果,但是这些方法的最大缺点是没有隐藏信息出现的频率,且防暴力破解能力差。

对于数字型信息的加密,比较好的方法是HILL 密码,因为它既能改变明文的结构,还能改变明文的内容。

二、对HILL 密码的改进与应用HILL 加密法是经典多图加密法的一种,它提出了一种基于联立方程的加密算法。

基于Android的通讯录实时同步功能

基于Android的通讯录实时同步功能

基于Android的通讯录实时同步功能陆少鹏;周渊平【摘要】随着Android系统的不断发展,Android系统被应用在各种设备上面,包括将Android系统应用到有线电话上.因此需要开发一个通讯录能够在搭载了Android系统的有线电话和手机之间实现数据实时同步.通讯录的客户端和服务端是通过Socket来建立连接的,然后采用Handler机制发送数据和读取数据,实现了通讯录数据的实时同步.经过测试,通讯录实现了手机与有线电话的通话记录,增加、修改和删除联系人的实时同步功能.%With the continuous development of Android system, the Android system has been used in a variety of devices, including applying to wire telephones. Therefore, we need to develop a contact which has the real-time synchronization function between wire telephone and mobile phone equipped with Android system. The contact establishes connection between client and server by using Socket, and using Handler mechanism to send data and read data, as a result, it realizes the function of the real-time synchronization for contact data. The test shows the contact achieves the goal of the real-time synchronization function of calling records, adding, modifying and deleting contacts between mobile phone and wire telephone.【期刊名称】《计算机系统应用》【年(卷),期】2017(026)005【总页数】5页(P257-261)【关键词】Android;通讯录;实时同步;socket;Handler【作者】陆少鹏;周渊平【作者单位】四川大学电子信息学院, 成都 610065;四川大学电子信息学院, 成都610065【正文语种】中文日常办公通讯通常使用固定电话,它具有抗干扰能力强,通话质量好,保密性高的特点,最突出的是辐射小[1],因此在室内办公时,用户更加趋向于使用有线电话.在这种情况下,将手机和有线电话的通讯录结合开发,实现在室外办公时能够实时同步有线电话的未接来电信息,方便即时回复未接来电,在室内办公时也能够实时同步手机的未接来电和联系人信息,方便电话拨打.目前的通讯录同步是为了解决一个用户的不同终端设备的用户数据备份不一致给用户带来不便的问题,需要用户手动上传和下载用户数据才能够实现通讯录同步[2].现在Android系统的通讯录同步比较典型的应用是小米云同步服务,其包括了通话记录同步、便签同步和短信等用户数据的同步[3],但是小米云同步也需要手动上传和下载数据进行数据同步,并不是自动进行同步的,而且是实现手机与手机之间或者是手机与平板电脑之间的数据同步.本文所做的通讯录的实时同步和现在的通讯录同步不同的是,该通讯录实现的是实时的和自动的通讯录数据同步,因此实时性比现有的通讯录同步好,由于是自动实现通讯录数据同步,所以该通讯录同步操作比现有的通讯录同步简便.而且同步的是手机和有线电话的通讯录数据库数据方便室内外的办公.本文所介绍的有线电话是由搭载了Android4.0操作系统的TQ210开发板实现的,具备了拨号的功能. Android系统架构采用了分层架构,从高层到低层依次分为应用程序层、应用程序框架层、系统运行库层和Linux核心层[4,5],如图1.应用程序层所有的程序都是JAVA语言所编写,通过调用应用程序框架层所提供的API来完成的[6]. Android的系统运行库层分为程序库和Android运行库.程序库主要包含一些C/C++库,这些库能够被Android系统的不同组件使用,它们通过应用程序框架层给开发者提供服务.Android运行库提供Java变成语言核心库大部分功能.Android的 Linux核心层是基于Linux2.6内核的,是硬件和软件之间的抽象层.通讯录同步系统主要分为客户端和服务器端,它们之间通过Socket建立连接.常用的Socket有两种:流式Socket和数据报式Socket.流式Socket是一种面向连接的TCP服务应用,数据报式Socket是一种无连接的UDP服务应用.通讯录的实时同步功能的客户端和服务端是采用了流式Socket,其原理框图如图2所示.由图2可知,通讯录的实时同步分为两个方向,分别为:手机端实时同步有线电话的通讯录数据和有线电话实时同步手机端的通讯录数据.当有线电话端的通讯录数据库发生变化时,有线电话端就会将发生变化的数据转换成输出流,并将该输出流发送给服务器端,服务器端读取到该输出流数据后将它转换为输出流供手机端读取该同步数据,该过程实现了手机端实时同步有线电话端的通讯录数据,如图2中灰色线过程.有线电话端实时同步手机端通讯录数据的过程就是红色线过程,即当手机端的通讯录数据库发生变化时,手机端就将变化的数据转换成输出流并将该输出流发生给服务器端,服务器端读取到该数据后再将该数据转换为输出流供有线电话端读取同步数据,最终实现有线电话通讯录实时同步手机端的通讯录数据.通讯录的的实时同步功能主要包括四个部分:通话记录、添加联系人、删除联系人和修改联系人的实时同步.客户端的程序流程图如图3.客户端的实现主要分为两个部分,一个部分是判断客户端是否连接网络,连接网络就将同步数据发送到服务器端,未连接网络就将同步数据存到SQLite数据库中.另一部分就是要实时监听通讯录数据库的数据变化,有数据变化时就发送数据到服务端,没有数据变化时就处于不断监听状态.客户端为了能够将同步数据发送到服务器端需要处于连接网络的状态,所以,在发送数据之前必须先检查客户端是否连接网络.客户端用getSystemService (Context.CONNECTIVITY_SERVICE)方法来获取ConnectivityManger类的对象,然后再通过该对象的getAllNetworkInfo()方法来获取到客户端的所有网络连接情况的对象,最后再使用该对象的getState()方法来判断客户端网络连接情况并且与NetworkInfo. state.CONNECTED对比判断是否相等就可以判断出客户端是否处于连接网络的状态.如果上面的判断结果是客户端未连接网络,则将同步数据存储在SQLite数据库中.SQLite数据库是通过继承SQLiteOpenHelper类来实现的.该数据库里面创建了两个表,分别为联系人表和通话记录表,分别用于存储联系人同步数据和通话记录同步数据.如果客户端判断为处于连接网络状态,则先将SQLite 数据库中存储的所有同步数据和客户端数据库刚更新的同步数据发送到服务器端.每当将SQLite数据库中的同步数据发送出去之后,就会调用SQLite数据库的delete()方法将旧的数据删除掉,方便之后的操作.要实现数据的实时同步首先得通过使用ContentObserver内容观察者监听通话记录数据库数据和联系人数据库的变化.假设手机有来电或则去电致使手机端的通话记录数据库数据发生变化或者手机端有对联系人数据库进行增加、删除或修改的操作致使联系人数据库发生变化,就会触发ContentObserver里面的onChange()方法,然后就可以在这个方法里面去获取新的数据并且通过out.println()把该条数据发送给服务器端.同时,有线电话端就可以通过重写Handler机制的handleMessage()方法来从服务器端获取到同步数据.有线电话端获取到同步数据之后,读取同步数据的标志位flag来判断该条数据是属于通话记录类型的还是联系人数据类型的.如果该条数据属于通话记录数据类型的,就需要将同步数据与本地通话记录数据库数据进行对比,如果该条同步数据是本地数据则不进行任何操作,如果同步数据非本地数据就需要通过Util.AddNumToCallLog()把同步数据插入到通话记录数据库中.如果这条数据是联系人数据类型的,也需要将该条同步数据与本地联系人数据库数据进行对比,如果该条数据属于本地数据库则不进行任何操作,否则通过 Util.AddContact()、Util.ChangeCotact()和Util.DeleteContact()分别对联系人数据库进行添加、修改和删除操作.通话记录数据库或则联系人数据库完成数据更新之后,就会触发加载器Loader的回调机制onLoadFinished()方法通知最终的运行结果,之后就会调用适配器的notifyDataSetChanged()方法,即当适配器的内容发生变化时通过这个方法强制调用getView来刷新每个item的内容,可以实现动态刷新列表从而动态更新UI界面.通过以上步骤有线电话端就可以实现实时同步手机端的数据了,反之同样可以实现手机端实时同步有线电话端的数据.客户端的Android程序是在Eclipse中建立的,在工程中建立了通话记录功能包、联系人功能包和内容观察者功能包等,这些功能包里面的Java代码分别实现了通讯录的联系人功能和显示通话记录功能等,其Android工程目录如图4所示.服务器端是采用ServerSocket创建的TCP服务端.服务器端程序流程图如图5所示.服务器端为了实现与客户端的连接,首先得使用ServerSocket()构造器创建一个服务器端的对象,然后在while(true)代码块里面使用server类的accept()方法不断地监听等待来自客户端的连接请求.由于,服务端得实现来自多个客户端的连接请求,所以,得使用Executors类下面的newCachedThreadPool()方法来存储多个客户端的连接请求并且得使用Java的多线程技术来分别处理来自不同客户端的连接请求.当服务器端监听到了来自客户端的连接请求之后,就会和客户端建立连接并且将该客户端添加到连接池中.与客户端建立连接之后,为了能够获取到客户端的同步数据,需要在服务器端使用Socket对象的getInputStream()方法来获取输入流对象,并且使用输入流对象的readLine()方法来读取来自客户端输出的同步数据.实现了服务器端的接收数据功能之后,就需要对所接收到的数据进行合法性判断.如果接收到的同步数据是不合法的就将该丢弃该同步数据并且不做任何操作,如果该同步数据合法就需要将该合法的同步数据发送给客户端.因此,服务器端为了能够将同步数据发送给客户端,服务器端需要使用 Socket对象的getOutputStream()方法获取输出流对象,然后使用输出流对象的println()将同步数据发送出去.实现上述功能之后,客户端就可以从服务器端读取到同步数据了.服务器端功能实现是在集成开发环境Eclipse中使用Java编程语言编写的,其工程目录如图6所示.测试系统能否正常工作分为以下几步[7,8]:① 将TQ210开发板和电话模块连接起来,组成系统测试所需要的搭载了Android 系统的有线电话,并打开开发板电源.② 打开Eclipse集成开发环境,首先启动服务器端的程序,使服务器处于工作状态.然后,在手机端和有线电话端安装通讯录的apk,并且使手机端和有线电话端的通讯录都处于工作状态.③ 测试联系人模块的实时同步功能,首先,进入手机端和有线电话端通讯录的联系人操作界面.然后,在手机端新增一个联系人保存该联系人之后,此时可以看到手机端和有线电话端同时新增了同一个联系人.如图7所示.④ 在手机端通讯录编辑刚才新添加的联系人,把该联系人的电话号码进行修改,保存之后可以观察到手机端的联系人和有线电话端的联系人的电话号码同时发生了改变.如图8所示.⑥ 手机和有线电话同时进入通讯录的通话记录界面,然后向手机拨打电话,通话结束后可以看到手机和有线电话的通话记录同时更新了同一条信息,可以通过观察通话记录上面的时间确定通话记录的实时同步.如图10所示.经过上面的测试结果可以知道,该通讯录实现了通话记录和增加、修改和删除联系人的实时同步功能.经过上面的测试,可以得出结论:该通讯录具有在通话记录和添加、删除、修改联系人的实时同步功能.事实上,可以把这个实时同步功能应用到办公人员的手机和办公电话上.当办公人员在外工作时,如果办公电话有未接来电时,办公人员可以即时知道这条来电信息并及时回复.也可以将该通讯录应用到具有多部手机的用户的手机上,只要每部手机都安装了该通讯录,就可以实现多部手机的通讯录数据的实时同步,这样可以免去用户在多部手机的同一个联系人进行相同的添加、删除和修改的操作.再则,随着4G和5G的发展,手机在室内的通话质量越来越差,在室内使用有线电话通话会比手机好,所以实现这个实时同步功能可以方便用户在有线电话上拨打手机端的联系人,免去查询电话号码的麻烦.因此,这个通讯录的实时同步功能具有很好应用前景.1薛莹,徐慨,黄麟舒.来电显示电路的设计.舰船电子工程, 2008,28(9):44–47.2马庆钟,姜弢.基于SyncML的CooTalk通讯录同步设计与实现[硕士学位论文].哈尔滨:哈尔滨工程大学,2013.3李辉,杨若瑜.基于安卓手机的信息云同步系统的设计与实现[硕士学位论文].南京:南京大学,2014.4熊积健,王琪.基于S5PV210平板电脑的设计.江西通信科技,2012,(1):12–15.5姚昱旻,刘卫国.Android的架构与应用开发研究.计算机系统应用,2008,17(11):110–112.6凡威,周渊平.基于Android平台的无线视频监控.计算机系统应用,2015,24(1):195–198.7杜江,周渊平.基于Android的电话拨号功能.计算机系统应用,2014,23(12):245–248.8陈成伟,周渊平.基于Android的有线电话CID功能.计算机系统应用,2016,25(1):85–89.。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

20xx-20xx 学年 x 学期xxxx大学电工电子实验教学中心创新性实验研究报告实验项目名称_基于android的手机通讯录_组长姓名xxx 学号xxxxxxxxxxxxxxx联系电话xxxxxxxxxxxx E-mail xxxxxxxxxxxx@成员姓名xxx 学号xxxxxxxxxxxxx成员姓名xxx 学号xxxxxxxxxxxxxxx专业电子信息工程班级20xx级x班指导教师及职称xx20xx年x月x 日开发流程见下图:1、增加、删除、编联系人点击通信录界面中的增加按钮,入增加联系人面。

输入联系人的基本信息,并可根据用户需求增加个性化信息如头像、姓名、手机号码、办室电话、家庭电话、职务职称、单位名称、地址、邮政编码、Email、其他联系方式、备注这些信息,击确认返回主界面。

点击通信录中一个已存在的联系人,进入联系人编辑界面,可修改系人的资料或进行删除联系人操作,完成后退回到主界面。

对列表中联系人的标记,点mnu键弹出功能界面上的删除按键也可进行删除。

还可以在菜单上选择删除全部联系人清空通讯录。

在删除联系人的过程中,系统将提示用户是否继续操作,若放弃操作,则系人信息将继续保存。

2、查找联系人用户点击menu键打开底部菜单框,底部菜单框为查询系人提供入口,进入通讯录的缺省页面为联系人列表,在列表中看到所有联系人的姓名、电话息排列,用户点击查找按键输入联系人基本信息,通讯录显所有符合查询条件的联系人列表,用户选择一个联系人进入联系人基本信息页面进行其他操作;查询完成,用户按返回键返回主界面。

3、通功能用户在通录选择联系人进入联系详细信息界面,这时点击menu键打开通信功能框,选择打电话、发信息的功能进行操作。

4、菜单能通过对menu按的点击,显示底部菜框,包含有增加查找、除、菜单、返回功能,菜单按键则包含显示所有、删除所有等实用功能。

五、实验结果与分析通讯录界面要求布局合理简约,颜色舒,控制按钮简单明了,让用户一眼就能看出各个按钮的作用及操方法。

能实要求的功能,但又不重复。

要考到不同手机屏幕大小可能不一样,应尽兼容大多数手机屏幕尺寸,使之显示无障碍。

增加联人的界面如图5-1所示图5-1 增加联人界面查找联系人面如图5-2所示图5-2 查找系人界面功能菜单界面图5-3所示5-3 功能菜单界面其他功能界面如图5-4所示5-4其他功能界面图5-5 menu主页面根据以上系的测试过程对来联系人进修改的详细测结果如图5-6所示图5-6 修改页面系统的测试中对联系人进行删除操作,如图5-7所示图5-7 删除页面系统除了增加删除、查找等基本功能外,还具有打电话、信息、发邮件的功能,在调出联系人信息时按menu键可以弹出能框如图5-8所示图5-8 功能框六、实验结论七、指导老师评语及得分:附录:程序代码增加界面绘制代码如下:<LinearLayoutxmlns:android="/apk/res/android"android:id="@+id/ScrollView1"android:layout_width="fill_parent"//宽度充满父空间android:layout_height="wrap_content"//根据内容决定高度android:scrollbars="vertical">//滚动条方向为垂直<LinearLayoutxmlns:android="/apk/res/android"android:layout_width="fill_parent"android:layout_height="wrap_content"android:orientation="vertical"><LinearLayoutandroid:id="@+id/widget205"android:layout_width="fill_parent"android:layout_height="wrap_content"android:layout_marginLeft="10dp"//左边距为10dpandroid:layout_marginRight="10dp">android:scaleType="centerCrop"//按比例缩放图片,保持图片的尺寸比例></ImageButton><EditTextandroid:id="@+id/username"android:layout_width="fill_parent"android:layout_height="wrap_content"android:scrollbars="vertical"android:hint="姓名"//hint当文本内容为空时,出现的提示信息android:gravity="top"//置顶垂直排列android:layout_gravity="center_vertical"//排列居中/></LinearLayout><TextViewandroid:layout_height="wrap_content"android:layout_width="wrap_content"android:text="手机:"android:textSize="20dp"/><EditTextandroid:id="@+id/mobilephone"android:layout_width="fill_parent"android:layout_height="wrap_content"android:scrollbars="vertical"android:gravity="top"android:hint="手机"android:phoneNumber="true"/>//只能输入数字</LinearLayout><LinearLayoutandroid:layout_width="fill_parent"android:layout_height="wrap_content"android:orientation="horizontal"android:layout_marginLeft="10dp"android:layout_marginRight="10dp"><Buttonandroid:id="@+id/btn_return"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_weight="1"android:text="返回"/></LinearLayout></LinearLayout>return;}//从表单上获取数据User user=new User();//在user类中定义了一个user函数ername=name;user.address=et_address.getText().toString();pany=et_company.getText().toString();user.email=et_email.getText().toString();tring();user.remark=et_remark.getText().toString();user.zipCode=et_zipCode.getText().toString();//判断头像是否改变,若改变,则用当前的位置,若没有改变,则用前一回的位置if(imageChanged){user.imageId=images[currentImagePosition%images.length];}else{ENGTH_LONG);}setTitle("用户添加成功!");setResult(3);//返回到上一个Activity,也就是Main.activityfinish();//销毁当前视图}});删除联系人程序:if(deleteId==null||deleteId.size()==0){Toast.makeText(Main.this,"没有标记任何记录\n长按一条记录即可标记",helper.deleteMarked(deleteId);list=helper.getAllUser(privacy);//重置视图adapter=new SimpleAdapter(Main.this,list,yout.listitem,newString[]{"imageid","name","mobilephone"},new int[]{er_image,_name,_mobilephone});lv.setAdapter(adapter);deleteId.clear();}}).setNegativeButton("取消",null).create().show();}break;查找联系人功能:private void loadSearchLinearout(){ent arg2){String condition=et_search.getText().toString();//获取et_search输入框的输入内容if(condition.equals("")){//如果输入的为空lv.setAdapter(adapter);//设置显示所有数据的listview列表的适配器}DBHelper helper=new DBHelper(Main.this);//获取数据库对象list=helper.getUsers(condition,privacy);//获取用户列表SimpleAdapter searchAdapter=new SimpleAdapter(Main.this,list,yout.listitem,}else{setTitle("共查到"+list.size()+"条记录");mainLinearLayout.setBackgroundDrawable(null);}return false;}});}}menu菜单代码:String[]bottom_menu_itemName={"增加","查找","删除","菜单","退出"};String fileName;ilist,R.drawable.menu_exit,};//选择功能图片响应menu点击事件时设置底部菜单是否可见,public boolean onKeyDown(int keyCode,KeyEvent event){if(keyCode==KeyEvent.KEYCODE_MENU){//如果点击menu键loadBottomMenu();//载入menu功能if(bottomMenuGrid.getVisibility()==View.VISIBLE){//设置可视if(searchLinearout!=null&&searchLinearout.getVisibility()==View.VISIBLE){//如果选择不为空且视图为可视searchLinearout.setVisibility(View.GONE);//设置可视视图不显示}bottomMenuGrid.setVisibility(View.GONE);//设置底部视图不显示}else{bottomMenuGrid.setOnItemClickListener(new OnItemClickListener(){public void onItemClick(AdapterView<?>arg0,View arg1,int arg2,long arg3){switch (arg2){case 0: {/*增加*/}case 1: {/*查找*/}if(callData==null){//加载可用的号码loadAvailableCallData();//加载电话号码}if(callData.length==0){//提示没有可用的号码Toast.makeText(this,"没有可用的号码!",Toast.LENGTH_LONG).show();}else if(callData.length==1){//如果之有一个可用的号码,这直接使用这个号码拨出Intent intent=new Intent(Intent.ACTION_CALL,Uri.parse("tel://"+callData[0]));//设置一个新的intent对象startActivity(intent);//开始活动事件}else{//如果有2个或者2个以上号码,弹出号码选择对话框initNumChooseDialog();//选择号码}break;//跳出}case Menu.FIRST+1:{status=Intent.ACTION_SENDTO;//将状态设置为发短信if(callData==null){//如果号码为空lo//如果之后又一个可用的号码,这直接使用这个号码拨出Intent intent=new Intent(Intent.ACTION_SENDTO,Uri.parse("smsto://"+callData[0]));//设置一个新的intent对象startActivity(intent);//开始活动事件}else{initNumChooseDialog();}//初始化号码break;}case Menu.FIRST+2:{if(user.email.equals("")){Toast.makeText(this,"没有可用的邮箱!",Toast.LENGTH_LONG).show();}startActivity(intent);//开始活动}break;//退出}}return super.onMenuItemSelected(featureId,item);//返回menu选择功能}显示所有,删除所有,备份功能程序:mainMenuGrid.setOnItemClickListener(new OnItemClickListener(){public void onItemClick(AdapterView<?>arg0,View arg1,int arg2,long arg3){switch(arg2){case0:{mainMenuDialog.dismiss();break;}case1:{AlertDialog.Builder builder=new AlertDialog.Builder(Main.this); confirmDialog=builder.create();builder.setTitle("是否删除所有!?");builder.setPositiveButton("确定",new DialogInterface.OnClickListener(){public void onClick(DialogInterface dialog,int which){DBHelper helper=new DBHelper(Main.this);helper.deleteAll(0);list=helper.getAllUser(privacy);adapter=new SimpleAdapter(Main.this,list,yout.listitem,new String[]{"imageid","name","mobilephone"},new int[]{er_image,_name,_mobilephone});}});builder.create().show();break;}case2:{mainMenuDialog.dismiss();new AlertDialog.Builder(Main.this).setTitle("是否需要备份记录到SD卡?").setPositiveButton("确定",new DialogInterface.OnClickListener(){public void onClick(DialogInterface dialog,int which){LayoutInflater li=LayoutInflater.from(Main.this);View backup_view=li.inflate(yout.backup_progress,null);progressDialog=new AlertDialog.Builder(Main.this).setTitle("备份正在进行中...") .setView(backup_view).create();progressDialog.show();DBHelper helper=new DBHelper(Main.this);helper.backupData(privacy);ProgressBar bar=(ProgressBar)backup_view.findViewById(R.id.pb_backup); Button btn_backup_ok=(Button)backup_view.findViewById(R.id.btn_backuup_ok); bar.setMax(list.size());for(int i=0;i<=list.size();i++){bar.setProgress(i);}.setNegativeButton("取消",null).create().show();break;}数据库继承关系程序:class MyDBHelper extends SQLiteOpenHelper{public MyDBHelper(Context context,String name,int version){//公共的MyDBHelper对象super(context,name,null,version);//继承上面的}我在数据库中运用了openDatabase的方法来打开数据库。

相关文档
最新文档