基于android的手机通讯录(附程序)
- 格式:docx
- 大小:184.72 KB
- 文档页数:15
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);联系⼈地址地址分为家庭,⼯作和其他。
基于互联网的手机通讯录的研究与实现林俊存;张华;谭伟【摘要】本系统采用Eclipse+Android+sdk+Cordova集成开发环境,运用Java 语言编程,使得用户只需通过手机浏览器就能实现任何时间,任何地方,任何手机拨打您所急需的联系人,一般使用时不需要下载任何手机app,主要解决了手机丢失,手机不在,手机关机等各种情况下需要对联系人进行及时的拨打,新建或者分享他人等需求.及解决了我们对手机客户端的依赖及手机系统的跨平台性,是一个面向所有用户的WebApp网页软件,使我们对联系人的获取及其他功能的操作变得更简单,更实用,更及时.【期刊名称】《电子世界》【年(卷),期】2016(000)023【总页数】2页(P9-10)【关键词】SSH整合;Cordova;JAVA语言;手机通讯录;移动互联网【作者】林俊存;张华;谭伟【作者单位】湖北民族学院信息工程学院;湖北民族学院信息工程学院;湖北民族学院信息工程学院【正文语种】中文如今在互联网技术的带动下,大数据及云端技术得到了快速发展,而手机面向这种技术将成为手机科技发展的必定趋势,手机是人们在生活中必不可少的工具,其设计的最初目的与最为重要的功能是为了方便联系。
我们不得不承认百度云盘的出现是一件多么美妙的事,但我们并不想下载手机客户端来存放我们的联系人,在某种情况下它是没有多大意义的。
近几年来,随着移动通信智能终端的普及和通信终端功能的不断增强,用户已经可以随时随地使用移动终端登录和访问互联网上的各种社区网站;另外,移动通信终端都存储有通讯录,现在大部分基于手机通讯录的应用也主要是针对因用户手机丢失而引起用户信息损失的通讯录备份功能,完全忽视了通讯录所代表和隐藏的潜在的社会网络关系。
手机通讯录可以说是我们手机中最重要的应用功能之一,特别是我们在更换手机的时候,首先要做的就是把旧手机上面的联系人更新到新手机上面去,以前碰到这个问题我们可能用得最多的是通过复制到SIM卡,再从SIM卡复制到新手机的方式,但是这个方法往往会受到数量以及新旧手机联系人不兼容的问题,并且最重要的是这个方法很慢。
开发中需要获取手机用户的通讯录信息,要求运行在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)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的企业内部通讯录的设计与实现背景和意义智能手机(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手机的通讯录联系人全部都存在系统的数据库中,如果须要获得通讯里联系人的信息就须要访问系统的数据库,才能将信息拿出来。
这一篇文章我主要带领同学们熟悉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这个类里面,如果想深入了解的话可以去看看,数据库相关的操作联查啊啥的都在里面。
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按的点击,显示底部菜框,包含有增加查找、除、菜单、返回功能,菜单按键则包含显示所有、删除所有等实用功能。
五、实验结果与分析通讯录界面要求布局合理简约,颜色舒,控制按钮简单明了,让用户一眼就能看出各个按钮的作用及操方法。
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):用于接收广播。
第一章绪论1.1 工程研究背景经过多年的开展,随着第三代网络的使用及四代网络的即将来了呢,移动终端不再仅是通讯网络的终端,还将成为互联网的终端。
因此,移动终端的应用软件和需要的效劳将会有很大的开展空间。
Google与包括HTC、摩托罗拉、三星、联想等在内的三十多家技术和无线应用的领军企业组成的开发联盟为此于2007年11月退出了一份专为移动设备设计的软件平台——Android OS。
Android 是一套真正意义上的移动性设备综合平台,它包括操作系统、中间件和一些关键的平台应用。
Android的Java程序运行环境包含一组Java核心函数库及Dalvik虚拟机,它们有效地优化额Java程序的运行过程。
Android 系统平台基于优化了的Linux内核,它提供诸如内存管理、进程管理、设备驱动等效劳,同时也是硬件的连接层。
Abdroid平台的开放性等特点既能促进技术〔包括平台本身〕的创新,又有助于降低开发本钱,还可以是运营商能非常方便地制定特色化的产品,因此,它具有很大的市场开展潜力。
1.2 工程研究的目的及意义随着3G网络的使用,移动终端不再仅是通讯网络的终端,还将成为互联网的终端。
因此,移动终端的应用软件和需要的效劳将会有很大的开展空间。
在Google和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一个月以来的第一个比较实用的小程序,此程序可以读取手机自带通讯录上的所有联系人,并且可以导入到这个通讯录列表,不用用户一个一个地输入,将导入的联系人信息保存在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近年来在全球范围内广泛被应用。
故本课题拟基于Android系统设计与实现一个即时通讯系统,以帮助实现人们的即时交流需求。
本课题拟通过深入阐述Android系统相关知识与即时通讯系统的设计、通讯协议、数据加密、用户身份验证、网络连接等方面的内容,实现基于Android系统的即时通讯系统设计与实现的目标。
从而最终实现一个安全、快速、稳定、有多种功能的即时通讯系统。
二、技术方案1. 设计思路本课题采用Android Studio开发工具进行开发,具体设计思路如下:①登录页设计:正确的信息被输入,则自动跳转到主页面界面。
②主页面设计:主要分为搜索、通讯录、消息、我四个模块设计。
③消息模块设计:消息展示,包含聊天模块及通知模块设计。
④聊天模块设计:通讯录模块所列出好友的点击进入聊天面板展示,包含表情包、发送语音、发送图片等功能。
⑤通讯录模块设计:设计出添加好友、查找好友等四个模块。
⑥我的模块设计:本课题主要设计了头像更改、个人信息修改及退出登录等功能。
2. 技术关键点本课题设计的技术关键点主要有:①使用XMPP协议:采用XMPP技术实现即时通讯系统。
②数据加密:使用AES加密算法进行数据加密。
③用户身份验证:使用MD5加密算法及RSA算法验证用户身份。
④ p2p通信:使用MTX技术实现android平台间高速数据传输。
⑤数据库存储:使用SQLite数据库进行数据的存储。
三、预期成果1. 功能实现本课题预期实现的功能主要包括:①用户注册、登录、退出等基本功能。
②通讯录管理,包括好友添加、群组管理等。
③聊天功能,包括文字、语音、图片、表情等多种形式。
④消息推送功能,包括好友请求、系统通知等。
⑤个人信息管理,包括个人资料修改、头像更换等。
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的方法来打开数据库。